@bitsocial/bitsocial-react-hooks 0.1.0
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/LICENSE +674 -0
- package/README.md +1365 -0
- package/dist/hooks/accounts/accounts.d.ts +64 -0
- package/dist/hooks/accounts/accounts.d.ts.map +1 -0
- package/dist/hooks/accounts/accounts.js +706 -0
- package/dist/hooks/accounts/accounts.js.map +1 -0
- package/dist/hooks/accounts/index.d.ts +2 -0
- package/dist/hooks/accounts/index.d.ts.map +1 -0
- package/dist/hooks/accounts/index.js +2 -0
- package/dist/hooks/accounts/index.js.map +1 -0
- package/dist/hooks/accounts/utils.d.ts +6 -0
- package/dist/hooks/accounts/utils.d.ts.map +1 -0
- package/dist/hooks/accounts/utils.js +226 -0
- package/dist/hooks/accounts/utils.js.map +1 -0
- package/dist/hooks/actions/actions.d.ts +19 -0
- package/dist/hooks/actions/actions.d.ts.map +1 -0
- package/dist/hooks/actions/actions.js +552 -0
- package/dist/hooks/actions/actions.js.map +1 -0
- package/dist/hooks/actions/index.d.ts +2 -0
- package/dist/hooks/actions/index.d.ts.map +1 -0
- package/dist/hooks/actions/index.js +2 -0
- package/dist/hooks/actions/index.js.map +1 -0
- package/dist/hooks/authors/author-avatars.d.ts +28 -0
- package/dist/hooks/authors/author-avatars.d.ts.map +1 -0
- package/dist/hooks/authors/author-avatars.js +191 -0
- package/dist/hooks/authors/author-avatars.js.map +1 -0
- package/dist/hooks/authors/authors.d.ts +37 -0
- package/dist/hooks/authors/authors.d.ts.map +1 -0
- package/dist/hooks/authors/authors.js +509 -0
- package/dist/hooks/authors/authors.js.map +1 -0
- package/dist/hooks/authors/index.d.ts +2 -0
- package/dist/hooks/authors/index.d.ts.map +1 -0
- package/dist/hooks/authors/index.js +2 -0
- package/dist/hooks/authors/index.js.map +1 -0
- package/dist/hooks/authors/utils.d.ts +4 -0
- package/dist/hooks/authors/utils.d.ts.map +1 -0
- package/dist/hooks/authors/utils.js +21 -0
- package/dist/hooks/authors/utils.js.map +1 -0
- package/dist/hooks/comments.d.ts +17 -0
- package/dist/hooks/comments.d.ts.map +1 -0
- package/dist/hooks/comments.js +351 -0
- package/dist/hooks/comments.js.map +1 -0
- package/dist/hooks/communities.d.ts +31 -0
- package/dist/hooks/communities.d.ts.map +1 -0
- package/dist/hooks/communities.js +389 -0
- package/dist/hooks/communities.js.map +1 -0
- package/dist/hooks/feeds/feeds.d.ts +18 -0
- package/dist/hooks/feeds/feeds.d.ts.map +1 -0
- package/dist/hooks/feeds/feeds.js +315 -0
- package/dist/hooks/feeds/feeds.js.map +1 -0
- package/dist/hooks/feeds/index.d.ts +2 -0
- package/dist/hooks/feeds/index.d.ts.map +1 -0
- package/dist/hooks/feeds/index.js +2 -0
- package/dist/hooks/feeds/index.js.map +1 -0
- package/dist/hooks/pkc-rpc.d.ts +7 -0
- package/dist/hooks/pkc-rpc.d.ts.map +1 -0
- package/dist/hooks/pkc-rpc.js +88 -0
- package/dist/hooks/pkc-rpc.js.map +1 -0
- package/dist/hooks/replies.d.ts +5 -0
- package/dist/hooks/replies.d.ts.map +1 -0
- package/dist/hooks/replies.js +155 -0
- package/dist/hooks/replies.js.map +1 -0
- package/dist/hooks/states.d.ts +15 -0
- package/dist/hooks/states.d.ts.map +1 -0
- package/dist/hooks/states.js +213 -0
- package/dist/hooks/states.js.map +1 -0
- package/dist/hooks/utils/use-interval.d.ts +3 -0
- package/dist/hooks/utils/use-interval.d.ts.map +1 -0
- package/dist/hooks/utils/use-interval.js +36 -0
- package/dist/hooks/utils/use-interval.js.map +1 -0
- package/dist/hooks/utils/use-previous.d.ts +1 -0
- package/dist/hooks/utils/use-previous.js +10 -0
- package/dist/index.d.ts +82 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +128 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/chain/chain.d.ts +36 -0
- package/dist/lib/chain/chain.d.ts.map +1 -0
- package/dist/lib/chain/chain.js +195 -0
- package/dist/lib/chain/chain.js.map +1 -0
- package/dist/lib/chain/index.d.ts +4 -0
- package/dist/lib/chain/index.d.ts.map +1 -0
- package/dist/lib/chain/index.js +4 -0
- package/dist/lib/chain/index.js.map +1 -0
- package/dist/lib/community-address.d.ts +6 -0
- package/dist/lib/community-address.d.ts.map +1 -0
- package/dist/lib/community-address.js +26 -0
- package/dist/lib/community-address.js.map +1 -0
- package/dist/lib/community-ref.d.ts +23 -0
- package/dist/lib/community-ref.d.ts.map +1 -0
- package/dist/lib/community-ref.js +113 -0
- package/dist/lib/community-ref.js.map +1 -0
- package/dist/lib/debug-utils.d.ts +9 -0
- package/dist/lib/debug-utils.d.ts.map +1 -0
- package/dist/lib/debug-utils.js +21 -0
- package/dist/lib/debug-utils.js.map +1 -0
- package/dist/lib/feed-sort-type.d.ts +2 -0
- package/dist/lib/feed-sort-type.d.ts.map +1 -0
- package/dist/lib/feed-sort-type.js +22 -0
- package/dist/lib/feed-sort-type.js.map +1 -0
- package/dist/lib/localforage-lru/index.d.ts +3 -0
- package/dist/lib/localforage-lru/index.d.ts.map +1 -0
- package/dist/lib/localforage-lru/index.js +46 -0
- package/dist/lib/localforage-lru/index.js.map +1 -0
- package/dist/lib/localforage-lru/localforage-lru.d.ts +6 -0
- package/dist/lib/localforage-lru/localforage-lru.d.ts.map +1 -0
- package/dist/lib/localforage-lru/localforage-lru.js +182 -0
- package/dist/lib/localforage-lru/localforage-lru.js.map +1 -0
- package/dist/lib/pkc-compat.d.ts +25 -0
- package/dist/lib/pkc-compat.d.ts.map +1 -0
- package/dist/lib/pkc-compat.js +131 -0
- package/dist/lib/pkc-compat.js.map +1 -0
- package/dist/lib/pkc-js/fixtures/markdown-example.d.ts +3 -0
- package/dist/lib/pkc-js/fixtures/markdown-example.d.ts.map +1 -0
- package/dist/lib/pkc-js/fixtures/markdown-example.js +280 -0
- package/dist/lib/pkc-js/fixtures/markdown-example.js.map +1 -0
- package/dist/lib/pkc-js/index.d.ts +11 -0
- package/dist/lib/pkc-js/index.d.ts.map +1 -0
- package/dist/lib/pkc-js/index.js +85 -0
- package/dist/lib/pkc-js/index.js.map +1 -0
- package/dist/lib/pkc-js/pkc-js-mock-content.d.ts +3 -0
- package/dist/lib/pkc-js/pkc-js-mock-content.d.ts.map +1 -0
- package/dist/lib/pkc-js/pkc-js-mock-content.js +1235 -0
- package/dist/lib/pkc-js/pkc-js-mock-content.js.map +1 -0
- package/dist/lib/pkc-js/pkc-js-mock.d.ts +137 -0
- package/dist/lib/pkc-js/pkc-js-mock.d.ts.map +1 -0
- package/dist/lib/pkc-js/pkc-js-mock.js +644 -0
- package/dist/lib/pkc-js/pkc-js-mock.js.map +1 -0
- package/dist/lib/polyfill.d.ts +3 -0
- package/dist/lib/polyfill.d.ts.map +1 -0
- package/dist/lib/polyfill.js +14 -0
- package/dist/lib/polyfill.js.map +1 -0
- package/dist/lib/protocol-compat.d.ts +14 -0
- package/dist/lib/protocol-compat.d.ts.map +1 -0
- package/dist/lib/protocol-compat.js +67 -0
- package/dist/lib/protocol-compat.js.map +1 -0
- package/dist/lib/test-utils.d.ts +29 -0
- package/dist/lib/test-utils.d.ts.map +1 -0
- package/dist/lib/test-utils.js +184 -0
- package/dist/lib/test-utils.js.map +1 -0
- package/dist/lib/utils/comment-moderation.d.ts +4 -0
- package/dist/lib/utils/comment-moderation.d.ts.map +1 -0
- package/dist/lib/utils/comment-moderation.js +56 -0
- package/dist/lib/utils/comment-moderation.js.map +1 -0
- package/dist/lib/utils/index.d.ts +4 -0
- package/dist/lib/utils/index.d.ts.map +1 -0
- package/dist/lib/utils/index.js +4 -0
- package/dist/lib/utils/index.js.map +1 -0
- package/dist/lib/utils/utils.d.ts +23 -0
- package/dist/lib/utils/utils.d.ts.map +1 -0
- package/dist/lib/utils/utils.js +375 -0
- package/dist/lib/utils/utils.js.map +1 -0
- package/dist/lib/validator.d.ts +30 -0
- package/dist/lib/validator.d.ts.map +1 -0
- package/dist/lib/validator.js +307 -0
- package/dist/lib/validator.js.map +1 -0
- package/dist/stores/accounts/account-generator.d.ts +51 -0
- package/dist/stores/accounts/account-generator.d.ts.map +1 -0
- package/dist/stores/accounts/account-generator.js +160 -0
- package/dist/stores/accounts/account-generator.js.map +1 -0
- package/dist/stores/accounts/accounts-actions-internal.d.ts +8 -0
- package/dist/stores/accounts/accounts-actions-internal.d.ts.map +1 -0
- package/dist/stores/accounts/accounts-actions-internal.js +403 -0
- package/dist/stores/accounts/accounts-actions-internal.js.map +1 -0
- package/dist/stores/accounts/accounts-actions.d.ts +46 -0
- package/dist/stores/accounts/accounts-actions.d.ts.map +1 -0
- package/dist/stores/accounts/accounts-actions.js +1341 -0
- package/dist/stores/accounts/accounts-actions.js.map +1 -0
- package/dist/stores/accounts/accounts-database.d.ts +34 -0
- package/dist/stores/accounts/accounts-database.d.ts.map +1 -0
- package/dist/stores/accounts/accounts-database.js +685 -0
- package/dist/stores/accounts/accounts-database.js.map +1 -0
- package/dist/stores/accounts/accounts-store.d.ts +32 -0
- package/dist/stores/accounts/accounts-store.d.ts.map +1 -0
- package/dist/stores/accounts/accounts-store.js +169 -0
- package/dist/stores/accounts/accounts-store.js.map +1 -0
- package/dist/stores/accounts/index.d.ts +4 -0
- package/dist/stores/accounts/index.d.ts.map +1 -0
- package/dist/stores/accounts/index.js +4 -0
- package/dist/stores/accounts/index.js.map +1 -0
- package/dist/stores/accounts/utils.d.ts +49 -0
- package/dist/stores/accounts/utils.d.ts.map +1 -0
- package/dist/stores/accounts/utils.js +419 -0
- package/dist/stores/accounts/utils.js.map +1 -0
- package/dist/stores/authors-comments/authors-comments-store.d.ts +37 -0
- package/dist/stores/authors-comments/authors-comments-store.d.ts.map +1 -0
- package/dist/stores/authors-comments/authors-comments-store.js +338 -0
- package/dist/stores/authors-comments/authors-comments-store.js.map +1 -0
- package/dist/stores/authors-comments/index.d.ts +4 -0
- package/dist/stores/authors-comments/index.d.ts.map +1 -0
- package/dist/stores/authors-comments/index.js +4 -0
- package/dist/stores/authors-comments/index.js.map +1 -0
- package/dist/stores/authors-comments/utils.d.ts +14 -0
- package/dist/stores/authors-comments/utils.d.ts.map +1 -0
- package/dist/stores/authors-comments/utils.js +81 -0
- package/dist/stores/authors-comments/utils.js.map +1 -0
- package/dist/stores/comments/comments-store.d.ts +19 -0
- package/dist/stores/comments/comments-store.d.ts.map +1 -0
- package/dist/stores/comments/comments-store.js +385 -0
- package/dist/stores/comments/comments-store.js.map +1 -0
- package/dist/stores/comments/index.d.ts +4 -0
- package/dist/stores/comments/index.d.ts.map +1 -0
- package/dist/stores/comments/index.js +4 -0
- package/dist/stores/comments/index.js.map +1 -0
- package/dist/stores/communities/communities-store.d.ts +17 -0
- package/dist/stores/communities/communities-store.d.ts.map +1 -0
- package/dist/stores/communities/communities-store.js +304 -0
- package/dist/stores/communities/communities-store.js.map +1 -0
- package/dist/stores/communities/index.d.ts +4 -0
- package/dist/stores/communities/index.d.ts.map +1 -0
- package/dist/stores/communities/index.js +4 -0
- package/dist/stores/communities/index.js.map +1 -0
- package/dist/stores/communities-pages/communities-pages-store.d.ts +23 -0
- package/dist/stores/communities-pages/communities-pages-store.d.ts.map +1 -0
- package/dist/stores/communities-pages/communities-pages-store.js +316 -0
- package/dist/stores/communities-pages/communities-pages-store.js.map +1 -0
- package/dist/stores/communities-pages/index.d.ts +4 -0
- package/dist/stores/communities-pages/index.d.ts.map +1 -0
- package/dist/stores/communities-pages/index.js +4 -0
- package/dist/stores/communities-pages/index.js.map +1 -0
- package/dist/stores/feeds/feed-sorter.d.ts +5 -0
- package/dist/stores/feeds/feed-sorter.d.ts.map +1 -0
- package/dist/stores/feeds/feed-sorter.js +135 -0
- package/dist/stores/feeds/feed-sorter.js.map +1 -0
- package/dist/stores/feeds/feeds-store.d.ts +25 -0
- package/dist/stores/feeds/feeds-store.d.ts.map +1 -0
- package/dist/stores/feeds/feeds-store.js +459 -0
- package/dist/stores/feeds/feeds-store.js.map +1 -0
- package/dist/stores/feeds/index.d.ts +4 -0
- package/dist/stores/feeds/index.d.ts.map +1 -0
- package/dist/stores/feeds/index.js +4 -0
- package/dist/stores/feeds/index.js.map +1 -0
- package/dist/stores/feeds/utils.d.ts +43 -0
- package/dist/stores/feeds/utils.d.ts.map +1 -0
- package/dist/stores/feeds/utils.js +736 -0
- package/dist/stores/feeds/utils.js.map +1 -0
- package/dist/stores/replies/index.d.ts +4 -0
- package/dist/stores/replies/index.d.ts.map +1 -0
- package/dist/stores/replies/index.js +4 -0
- package/dist/stores/replies/index.js.map +1 -0
- package/dist/stores/replies/replies-comments-store.d.ts +8 -0
- package/dist/stores/replies/replies-comments-store.d.ts.map +1 -0
- package/dist/stores/replies/replies-comments-store.js +23 -0
- package/dist/stores/replies/replies-comments-store.js.map +1 -0
- package/dist/stores/replies/replies-store.d.ts +29 -0
- package/dist/stores/replies/replies-store.d.ts.map +1 -0
- package/dist/stores/replies/replies-store.js +413 -0
- package/dist/stores/replies/replies-store.js.map +1 -0
- package/dist/stores/replies/utils.d.ts +25 -0
- package/dist/stores/replies/utils.d.ts.map +1 -0
- package/dist/stores/replies/utils.js +549 -0
- package/dist/stores/replies/utils.js.map +1 -0
- package/dist/stores/replies-pages/index.d.ts +4 -0
- package/dist/stores/replies-pages/index.d.ts.map +1 -0
- package/dist/stores/replies-pages/index.js +4 -0
- package/dist/stores/replies-pages/index.js.map +1 -0
- package/dist/stores/replies-pages/replies-pages-store.d.ts +20 -0
- package/dist/stores/replies-pages/replies-pages-store.d.ts.map +1 -0
- package/dist/stores/replies-pages/replies-pages-store.js +270 -0
- package/dist/stores/replies-pages/replies-pages-store.js.map +1 -0
- package/dist/stores/replies-pages/utils.d.ts +3 -0
- package/dist/stores/replies-pages/utils.d.ts.map +1 -0
- package/dist/stores/replies-pages/utils.js +43 -0
- package/dist/stores/replies-pages/utils.js.map +1 -0
- package/dist/types.d.ts +638 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +160 -0
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import assert from "assert";
|
|
11
|
+
import QuickLru from "quick-lru";
|
|
12
|
+
import Logger from "@pkcprotocol/pkc-logger";
|
|
13
|
+
import { areEquivalentCommunityAddresses } from "../community-address.js";
|
|
14
|
+
import { getCommentCommunityAddress, normalizePublicationOptionsForStore } from "../pkc-compat.js";
|
|
15
|
+
import { getPageRpcClients } from "../pkc-compat.js";
|
|
16
|
+
const log = Logger("bitsocial-react-hooks:utils");
|
|
17
|
+
const merge = (...args) => {
|
|
18
|
+
// @ts-ignore
|
|
19
|
+
const clonedArgs = args.map((arg) => {
|
|
20
|
+
assert(arg && typeof arg === "object", `utils.merge argument '${arg}' not an object`);
|
|
21
|
+
return clone(arg);
|
|
22
|
+
});
|
|
23
|
+
const mergedObj = {};
|
|
24
|
+
while (clonedArgs.length) {
|
|
25
|
+
const currentArg = clonedArgs.shift();
|
|
26
|
+
for (const i in currentArg) {
|
|
27
|
+
if (currentArg[i] === undefined || currentArg[i] === null) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
mergedObj[i] = currentArg[i];
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return mergedObj;
|
|
34
|
+
};
|
|
35
|
+
const clone = (obj) => {
|
|
36
|
+
var _a, _b;
|
|
37
|
+
assert(obj && typeof obj === "object", `utils.clone argument '${obj}' not an object`);
|
|
38
|
+
let clonedObj = {};
|
|
39
|
+
// clean the object to be cloned
|
|
40
|
+
for (const i in obj) {
|
|
41
|
+
// remove functions
|
|
42
|
+
if (typeof obj[i] === "function") {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
// remove internal props
|
|
46
|
+
if (i.startsWith("_")) {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (obj[i] === undefined || obj[i] === null) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
// pkc-js has a bug where pkc instances have circular deps
|
|
53
|
+
if (((_b = (_a = obj[i]) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.name) === "PKC") {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
clonedObj[i] = obj[i];
|
|
57
|
+
}
|
|
58
|
+
// clone the object
|
|
59
|
+
clonedObj = JSON.parse(JSON.stringify(clonedObj));
|
|
60
|
+
return clonedObj;
|
|
61
|
+
};
|
|
62
|
+
// this function should not clone the comments to not waste memory
|
|
63
|
+
export const flattenCommentsPages = (pageInstanceOrPagesInstance) => {
|
|
64
|
+
var _a, _b;
|
|
65
|
+
const flattenedComments = [];
|
|
66
|
+
// if is a Page instance
|
|
67
|
+
if (pageInstanceOrPagesInstance === null || pageInstanceOrPagesInstance === void 0 ? void 0 : pageInstanceOrPagesInstance.comments) {
|
|
68
|
+
for (const comment of pageInstanceOrPagesInstance.comments) {
|
|
69
|
+
flattenedComments.push(comment);
|
|
70
|
+
if (((_a = comment.replies) === null || _a === void 0 ? void 0 : _a.pages) && Object.keys(comment.replies.pages).length) {
|
|
71
|
+
flattenedComments.push(...flattenCommentsPages(comment.replies));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// if is a Pages instance
|
|
76
|
+
else if (pageInstanceOrPagesInstance === null || pageInstanceOrPagesInstance === void 0 ? void 0 : pageInstanceOrPagesInstance.pages) {
|
|
77
|
+
for (const sortType in pageInstanceOrPagesInstance.pages) {
|
|
78
|
+
flattenedComments.push(...flattenCommentsPages(pageInstanceOrPagesInstance.pages[sortType]));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// if is a Pages.pages instance
|
|
82
|
+
else {
|
|
83
|
+
for (const sortType in pageInstanceOrPagesInstance) {
|
|
84
|
+
const page = pageInstanceOrPagesInstance[sortType];
|
|
85
|
+
if ((_b = page === null || page === void 0 ? void 0 : page.comments) === null || _b === void 0 ? void 0 : _b.length) {
|
|
86
|
+
flattenedComments.push(...flattenCommentsPages(page));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// remove duplicate comments
|
|
91
|
+
const flattenedCommentsObject = {};
|
|
92
|
+
for (const comment of flattenedComments) {
|
|
93
|
+
// @ts-ignore
|
|
94
|
+
flattenedCommentsObject[comment.cid] = comment;
|
|
95
|
+
}
|
|
96
|
+
const uniqueFlattened = [];
|
|
97
|
+
for (const cid in flattenedCommentsObject) {
|
|
98
|
+
// @ts-ignore
|
|
99
|
+
uniqueFlattened.push(flattenedCommentsObject[cid]);
|
|
100
|
+
}
|
|
101
|
+
return uniqueFlattened;
|
|
102
|
+
};
|
|
103
|
+
const memo = (functionToMemo, memoOptions) => {
|
|
104
|
+
assert(typeof functionToMemo === "function", `memo first argument must be a function`);
|
|
105
|
+
const pendingPromises = new Map();
|
|
106
|
+
const cache = new QuickLru(memoOptions);
|
|
107
|
+
// preserve function name
|
|
108
|
+
const memoedFunctionName = functionToMemo.name || "memoedFunction";
|
|
109
|
+
const obj = {
|
|
110
|
+
[memoedFunctionName]: (...args) => __awaiter(void 0, void 0, void 0, function* () {
|
|
111
|
+
let cacheKey = args[0];
|
|
112
|
+
if (args.length > 1) {
|
|
113
|
+
cacheKey = "";
|
|
114
|
+
for (const arg of args) {
|
|
115
|
+
if (typeof arg !== "string" &&
|
|
116
|
+
typeof arg !== "number" &&
|
|
117
|
+
arg !== undefined &&
|
|
118
|
+
arg !== null) {
|
|
119
|
+
const argumentIndex = args.indexOf(arg);
|
|
120
|
+
throw Error(`memoed function '${memoedFunctionName}' invalid argument number '${argumentIndex}' '${arg}', memoed function can only use multiple arguments if they are all of type string, number, undefined or null`);
|
|
121
|
+
}
|
|
122
|
+
cacheKey += arg;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// has cached result
|
|
126
|
+
const cached = cache.get(cacheKey);
|
|
127
|
+
if (cached) {
|
|
128
|
+
return cached;
|
|
129
|
+
}
|
|
130
|
+
// don't request the same thing twice if fetching is pending
|
|
131
|
+
let pendingPromise = pendingPromises.get(cacheKey);
|
|
132
|
+
if (pendingPromise) {
|
|
133
|
+
return pendingPromise;
|
|
134
|
+
}
|
|
135
|
+
// create the pending promise
|
|
136
|
+
let resolve, reject;
|
|
137
|
+
pendingPromise = new Promise((_resolve, _reject) => {
|
|
138
|
+
resolve = _resolve;
|
|
139
|
+
reject = _reject;
|
|
140
|
+
});
|
|
141
|
+
pendingPromises.set(cacheKey, pendingPromise);
|
|
142
|
+
// execute the function
|
|
143
|
+
try {
|
|
144
|
+
const result = yield functionToMemo(...args);
|
|
145
|
+
cache.set(cacheKey, result);
|
|
146
|
+
pendingPromises.delete(cacheKey);
|
|
147
|
+
resolve === null || resolve === void 0 ? void 0 : resolve(result);
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
pendingPromises.delete(cacheKey);
|
|
151
|
+
reject === null || reject === void 0 ? void 0 : reject(error);
|
|
152
|
+
}
|
|
153
|
+
return pendingPromise;
|
|
154
|
+
}),
|
|
155
|
+
};
|
|
156
|
+
return obj[memoedFunctionName];
|
|
157
|
+
};
|
|
158
|
+
const memoSync = (functionToMemo, memoOptions) => {
|
|
159
|
+
assert(typeof functionToMemo === "function", `memo first argument must be a function`);
|
|
160
|
+
const cache = new QuickLru(memoOptions);
|
|
161
|
+
// preserve function name
|
|
162
|
+
const memoedFunctionName = functionToMemo.name || "memoedFunction";
|
|
163
|
+
const obj = {
|
|
164
|
+
[memoedFunctionName]: (...args) => {
|
|
165
|
+
let cacheKey = args[0];
|
|
166
|
+
if (args.length > 1) {
|
|
167
|
+
cacheKey = "";
|
|
168
|
+
for (const arg of args) {
|
|
169
|
+
if (typeof arg !== "string" &&
|
|
170
|
+
typeof arg !== "number" &&
|
|
171
|
+
arg !== undefined &&
|
|
172
|
+
arg !== null) {
|
|
173
|
+
const argumentIndex = args.indexOf(arg);
|
|
174
|
+
throw Error(`memoed function '${memoedFunctionName}' invalid argument number '${argumentIndex}' '${arg}', memoed function can only use multiple arguments if they are all of type string, number, undefined or null`);
|
|
175
|
+
}
|
|
176
|
+
cacheKey += arg;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// has cached result
|
|
180
|
+
const cached = cache.get(cacheKey);
|
|
181
|
+
if (cached) {
|
|
182
|
+
return cached;
|
|
183
|
+
}
|
|
184
|
+
// execute the function
|
|
185
|
+
const result = functionToMemo(...args);
|
|
186
|
+
if (typeof (result === null || result === void 0 ? void 0 : result.then) === "function") {
|
|
187
|
+
throw Error(`memoed function '${memoedFunctionName}' is an async function, cannot be used with memoSync, use memo instead`);
|
|
188
|
+
}
|
|
189
|
+
cache.set(cacheKey, result);
|
|
190
|
+
return result;
|
|
191
|
+
},
|
|
192
|
+
};
|
|
193
|
+
return obj[memoedFunctionName];
|
|
194
|
+
};
|
|
195
|
+
const clientsOnStateChange = (clients, onStateChange) => {
|
|
196
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
197
|
+
for (const clientUrl in clients === null || clients === void 0 ? void 0 : clients.ipfsGateways) {
|
|
198
|
+
(_a = clients === null || clients === void 0 ? void 0 : clients.ipfsGateways) === null || _a === void 0 ? void 0 : _a[clientUrl].on("statechange", (state) => onStateChange(state, "ipfsGateways", clientUrl));
|
|
199
|
+
}
|
|
200
|
+
for (const clientUrl in clients === null || clients === void 0 ? void 0 : clients.kuboRpcClients) {
|
|
201
|
+
(_b = clients === null || clients === void 0 ? void 0 : clients.kuboRpcClients) === null || _b === void 0 ? void 0 : _b[clientUrl].on("statechange", (state) => onStateChange(state, "kuboRpcClients", clientUrl));
|
|
202
|
+
}
|
|
203
|
+
for (const clientUrl in clients === null || clients === void 0 ? void 0 : clients.pubsubKuboRpcClients) {
|
|
204
|
+
(_c = clients === null || clients === void 0 ? void 0 : clients.pubsubKuboRpcClients) === null || _c === void 0 ? void 0 : _c[clientUrl].on("statechange", (state) => onStateChange(state, "pubsubKuboRpcClients", clientUrl));
|
|
205
|
+
}
|
|
206
|
+
const rpcClients = getPageRpcClients(clients);
|
|
207
|
+
for (const clientUrl in rpcClients) {
|
|
208
|
+
rpcClients === null || rpcClients === void 0 ? void 0 : rpcClients[clientUrl].on("statechange", (state) => onStateChange(state, "pkcRpcClients", clientUrl));
|
|
209
|
+
}
|
|
210
|
+
for (const clientUrl in clients === null || clients === void 0 ? void 0 : clients.libp2pJsClients) {
|
|
211
|
+
(_d = clients === null || clients === void 0 ? void 0 : clients.libp2pJsClients) === null || _d === void 0 ? void 0 : _d[clientUrl].on("statechange", (state) => onStateChange(state, "libp2pJsClients", clientUrl));
|
|
212
|
+
}
|
|
213
|
+
for (const chainTicker in clients === null || clients === void 0 ? void 0 : clients.chainProviders) {
|
|
214
|
+
for (const clientUrl in (_e = clients === null || clients === void 0 ? void 0 : clients.chainProviders) === null || _e === void 0 ? void 0 : _e[chainTicker]) {
|
|
215
|
+
(_g = (_f = clients === null || clients === void 0 ? void 0 : clients.chainProviders) === null || _f === void 0 ? void 0 : _f[chainTicker]) === null || _g === void 0 ? void 0 : _g[clientUrl].on("statechange", (state) => onStateChange(state, "chainProviders", clientUrl, chainTicker));
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
for (const resolverKey in clients === null || clients === void 0 ? void 0 : clients.nameResolvers) {
|
|
219
|
+
(_h = clients === null || clients === void 0 ? void 0 : clients.nameResolvers) === null || _h === void 0 ? void 0 : _h[resolverKey].on("statechange", (state) => onStateChange(state, "nameResolvers", resolverKey));
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
const pageClientsOnStateChange = (clients, onStateChange) => {
|
|
223
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
224
|
+
for (const sortType in clients === null || clients === void 0 ? void 0 : clients.ipfsGateways) {
|
|
225
|
+
for (const clientUrl in (_a = clients === null || clients === void 0 ? void 0 : clients.ipfsGateways) === null || _a === void 0 ? void 0 : _a[sortType]) {
|
|
226
|
+
(_c = (_b = clients === null || clients === void 0 ? void 0 : clients.ipfsGateways) === null || _b === void 0 ? void 0 : _b[sortType]) === null || _c === void 0 ? void 0 : _c[clientUrl].on("statechange", (state) => onStateChange(state, "ipfsGateways", sortType, clientUrl));
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
for (const sortType in clients === null || clients === void 0 ? void 0 : clients.kuboRpcClients) {
|
|
230
|
+
for (const clientUrl in (_d = clients === null || clients === void 0 ? void 0 : clients.kuboRpcClients) === null || _d === void 0 ? void 0 : _d[sortType]) {
|
|
231
|
+
(_f = (_e = clients === null || clients === void 0 ? void 0 : clients.kuboRpcClients) === null || _e === void 0 ? void 0 : _e[sortType]) === null || _f === void 0 ? void 0 : _f[clientUrl].on("statechange", (state) => onStateChange(state, "kuboRpcClients", sortType, clientUrl));
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
const rpcPageClients = getPageRpcClients(clients);
|
|
235
|
+
for (const sortType in rpcPageClients) {
|
|
236
|
+
for (const clientUrl in rpcPageClients === null || rpcPageClients === void 0 ? void 0 : rpcPageClients[sortType]) {
|
|
237
|
+
(_g = rpcPageClients === null || rpcPageClients === void 0 ? void 0 : rpcPageClients[sortType]) === null || _g === void 0 ? void 0 : _g[clientUrl].on("statechange", (state) => onStateChange(state, "pkcRpcClients", sortType, clientUrl));
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
for (const sortType in clients === null || clients === void 0 ? void 0 : clients.libp2pJsClients) {
|
|
241
|
+
for (const clientUrl in (_h = clients === null || clients === void 0 ? void 0 : clients.libp2pJsClients) === null || _h === void 0 ? void 0 : _h[sortType]) {
|
|
242
|
+
(_k = (_j = clients === null || clients === void 0 ? void 0 : clients.libp2pJsClients) === null || _j === void 0 ? void 0 : _j[sortType]) === null || _k === void 0 ? void 0 : _k[clientUrl].on("statechange", (state) => onStateChange(state, "libp2pJsClients", sortType, clientUrl));
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
export const communityPostsCacheExpired = (community) => {
|
|
247
|
+
// NOTE: fetchedAt is undefined on owner communities
|
|
248
|
+
if (!community || community.fetchedAt == null) {
|
|
249
|
+
return false;
|
|
250
|
+
}
|
|
251
|
+
// if community cache is older than 1 hour, its community.posts are considered expired
|
|
252
|
+
const oneHourAgo = Date.now() / 1000 - 60 * 60;
|
|
253
|
+
return oneHourAgo > community.fetchedAt;
|
|
254
|
+
};
|
|
255
|
+
export const removeInvalidComments = (comments_1, _a, pkc_1) => __awaiter(void 0, [comments_1, _a, pkc_1], void 0, function* (comments, { validateReplies, blockCommunity }, pkc) {
|
|
256
|
+
if (!comments.length) {
|
|
257
|
+
return [];
|
|
258
|
+
}
|
|
259
|
+
const isValid = yield Promise.all(comments.map((comment) => commentIsValid(comment, { validateReplies, blockCommunity }, pkc)));
|
|
260
|
+
const validComments = comments.filter((_, i) => isValid[i]);
|
|
261
|
+
return validComments;
|
|
262
|
+
});
|
|
263
|
+
const communitiesWithInvalidComments = {};
|
|
264
|
+
export const commentIsValid = (comment_1, ...args_1) => __awaiter(void 0, [comment_1, ...args_1], void 0, function* (comment, { validateReplies, blockCommunity } = {}, pkc) {
|
|
265
|
+
validateReplies = Boolean(validateReplies);
|
|
266
|
+
if (blockCommunity === undefined || blockCommunity === null) {
|
|
267
|
+
blockCommunity = true;
|
|
268
|
+
}
|
|
269
|
+
if (!comment) {
|
|
270
|
+
return false;
|
|
271
|
+
}
|
|
272
|
+
if (communitiesWithInvalidComments[comment.communityAddress]) {
|
|
273
|
+
console.log(`community '${comment.communityAddress}' had an invalid comment, invalidate all its future comments to avoid wasting resources`);
|
|
274
|
+
return false;
|
|
275
|
+
}
|
|
276
|
+
try {
|
|
277
|
+
yield pkc.validateComment(comment, { validateReplies });
|
|
278
|
+
}
|
|
279
|
+
catch (e) {
|
|
280
|
+
if (blockCommunity) {
|
|
281
|
+
communitiesWithInvalidComments[comment.communityAddress] = true;
|
|
282
|
+
}
|
|
283
|
+
console.log("invalid comment", { comment, error: e });
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
return true;
|
|
287
|
+
});
|
|
288
|
+
const repliesAreValid = (comment_1, ...args_1) => __awaiter(void 0, [comment_1, ...args_1], void 0, function* (comment, { validateReplies, blockCommunity } = {}, pkc) {
|
|
289
|
+
var _a;
|
|
290
|
+
validateReplies = Boolean(validateReplies);
|
|
291
|
+
if (blockCommunity === undefined || blockCommunity === null) {
|
|
292
|
+
blockCommunity = true;
|
|
293
|
+
}
|
|
294
|
+
if (!comment) {
|
|
295
|
+
return false;
|
|
296
|
+
}
|
|
297
|
+
const commentCommunityAddress = getCommentCommunityAddress(comment);
|
|
298
|
+
if (commentCommunityAddress && communitiesWithInvalidComments[commentCommunityAddress]) {
|
|
299
|
+
console.log(`community '${commentCommunityAddress}' had an invalid comment, invalidate all its future comments to avoid wasting resources`);
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
const replyPageArray = Object.values(((_a = comment.replies) === null || _a === void 0 ? void 0 : _a.pages) || {});
|
|
303
|
+
const replies = replyPageArray.flatMap((replyPage) => (replyPage === null || replyPage === void 0 ? void 0 : replyPage.comments) || []);
|
|
304
|
+
const normalizedReplies = replies.map((reply) => {
|
|
305
|
+
const normalizedReply = normalizePublicationOptionsForStore(reply);
|
|
306
|
+
normalizedReply.communityAddress =
|
|
307
|
+
getCommentCommunityAddress(normalizedReply) || commentCommunityAddress;
|
|
308
|
+
return normalizedReply;
|
|
309
|
+
});
|
|
310
|
+
// manual validation
|
|
311
|
+
for (const reply of normalizedReplies) {
|
|
312
|
+
if (!areEquivalentCommunityAddresses(getCommentCommunityAddress(reply), commentCommunityAddress) ||
|
|
313
|
+
reply.depth !== comment.depth + 1 ||
|
|
314
|
+
reply.parentCid !== comment.cid) {
|
|
315
|
+
if (blockCommunity && commentCommunityAddress) {
|
|
316
|
+
communitiesWithInvalidComments[commentCommunityAddress] = true;
|
|
317
|
+
}
|
|
318
|
+
console.log("invalid comment", {
|
|
319
|
+
comment: reply,
|
|
320
|
+
error: "!areEquivalentCommunityAddresses(reply.communityAddress, comment.communityAddress) || reply.depth !== comment.depth + 1 || reply.parentCid !== comment.cid",
|
|
321
|
+
});
|
|
322
|
+
return false;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
// signature verification
|
|
326
|
+
try {
|
|
327
|
+
const promises = normalizedReplies.map((reply) => commentIsValid(reply, { validateReplies: false, blockCommunity: true }, pkc));
|
|
328
|
+
yield Promise.all(promises);
|
|
329
|
+
}
|
|
330
|
+
catch (e) {
|
|
331
|
+
if (blockCommunity && commentCommunityAddress) {
|
|
332
|
+
communitiesWithInvalidComments[commentCommunityAddress] = true;
|
|
333
|
+
}
|
|
334
|
+
console.log("invalid comment", { comment, error: e });
|
|
335
|
+
return false;
|
|
336
|
+
}
|
|
337
|
+
return true;
|
|
338
|
+
});
|
|
339
|
+
const utils = {
|
|
340
|
+
merge,
|
|
341
|
+
clone,
|
|
342
|
+
flattenCommentsPages,
|
|
343
|
+
memo,
|
|
344
|
+
memoSync,
|
|
345
|
+
retryInfinity: (f, o) => { },
|
|
346
|
+
// export timeout values to mock them in tests
|
|
347
|
+
retryInfinityMinTimeout: 1000,
|
|
348
|
+
retryInfinityMaxTimeout: 1000 * 60 * 60 * 24,
|
|
349
|
+
clientsOnStateChange,
|
|
350
|
+
pageClientsOnStateChange,
|
|
351
|
+
communityPostsCacheExpired,
|
|
352
|
+
commentIsValid,
|
|
353
|
+
removeInvalidComments,
|
|
354
|
+
repliesAreValid,
|
|
355
|
+
};
|
|
356
|
+
const retryInfinity = (functionToRetry, options) => __awaiter(void 0, void 0, void 0, function* () {
|
|
357
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
358
|
+
let attempt = 0;
|
|
359
|
+
while (true) {
|
|
360
|
+
try {
|
|
361
|
+
const res = yield functionToRetry();
|
|
362
|
+
return res;
|
|
363
|
+
}
|
|
364
|
+
catch (e) {
|
|
365
|
+
options === null || options === void 0 ? void 0 : options.onError(e || Error(`retryInfinity failed attempt ${attempt}`));
|
|
366
|
+
const factor = 2;
|
|
367
|
+
let timeout = Math.round(utils.retryInfinityMinTimeout * Math.pow(factor, attempt++));
|
|
368
|
+
timeout = Math.min(timeout, utils.retryInfinityMaxTimeout);
|
|
369
|
+
yield sleep(timeout);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
});
|
|
373
|
+
utils.retryInfinity = retryInfinity;
|
|
374
|
+
export default utils;
|
|
375
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/lib/utils/utils.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,yBAAyB,CAAC;AAG7C,OAAO,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,mCAAmC,EAAE,MAAM,eAAe,CAAC;AAChG,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,MAAM,GAAG,GAAG,MAAM,CAAC,6BAA6B,CAAC,CAAC;AAElD,MAAM,KAAK,GAAG,CAAC,GAAG,IAAS,EAAE,EAAE;IAC7B,aAAa;IACb,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAClC,MAAM,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,yBAAyB,GAAG,iBAAiB,CAAC,CAAC;QACtF,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IACH,MAAM,SAAS,GAAQ,EAAE,CAAC;IAC1B,OAAO,UAAU,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC;QACtC,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC1D,SAAS;YACX,CAAC;YACD,SAAS,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,KAAK,GAAG,CAAC,GAAQ,EAAE,EAAE;;IACzB,MAAM,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,yBAAyB,GAAG,iBAAiB,CAAC,CAAC;IACtF,IAAI,SAAS,GAAQ,EAAE,CAAC;IAExB,gCAAgC;IAChC,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACpB,mBAAmB;QACnB,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC;YACjC,SAAS;QACX,CAAC;QACD,wBAAwB;QACxB,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,SAAS;QACX,CAAC;QACD,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5C,SAAS;QACX,CAAC;QACD,0DAA0D;QAC1D,IAAI,CAAA,MAAA,MAAA,GAAG,CAAC,CAAC,CAAC,0CAAE,WAAW,0CAAE,IAAI,MAAK,KAAK,EAAE,CAAC;YACxC,SAAS;QACX,CAAC;QACD,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IAED,mBAAmB;IACnB,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;IAClD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,kEAAkE;AAClE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,2BAAgC,EAAE,EAAE;;IACvE,MAAM,iBAAiB,GAAG,EAAE,CAAC;IAE7B,wBAAwB;IACxB,IAAI,2BAA2B,aAA3B,2BAA2B,uBAA3B,2BAA2B,CAAE,QAAQ,EAAE,CAAC;QAC1C,KAAK,MAAM,OAAO,IAAI,2BAA2B,CAAC,QAAQ,EAAE,CAAC;YAC3D,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAChC,IAAI,CAAA,MAAA,OAAO,CAAC,OAAO,0CAAE,KAAK,KAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;gBACxE,iBAAiB,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;IACH,CAAC;IAED,yBAAyB;SACpB,IAAI,2BAA2B,aAA3B,2BAA2B,uBAA3B,2BAA2B,CAAE,KAAK,EAAE,CAAC;QAC5C,KAAK,MAAM,QAAQ,IAAI,2BAA2B,CAAC,KAAK,EAAE,CAAC;YACzD,iBAAiB,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,2BAA2B,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC;IAED,+BAA+B;SAC1B,CAAC;QACJ,KAAK,MAAM,QAAQ,IAAI,2BAA2B,EAAE,CAAC;YACnD,MAAM,IAAI,GAAG,2BAA2B,CAAC,QAAQ,CAAC,CAAC;YACnD,IAAI,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,QAAQ,0CAAE,MAAM,EAAE,CAAC;gBAC3B,iBAAiB,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,MAAM,uBAAuB,GAAG,EAAE,CAAC;IACnC,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE,CAAC;QACxC,aAAa;QACb,uBAAuB,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;IACjD,CAAC;IACD,MAAM,eAAe,GAAG,EAAE,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,uBAAuB,EAAE,CAAC;QAC1C,aAAa;QACb,eAAe,CAAC,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,eAAe,CAAC;AACzB,CAAC,CAAC;AAEF,MAAM,IAAI,GAAG,CAAC,cAAwB,EAAE,WAAgB,EAAE,EAAE;IAC1D,MAAM,CAAC,OAAO,cAAc,KAAK,UAAU,EAAE,wCAAwC,CAAC,CAAC;IACvF,MAAM,eAAe,GAAQ,IAAI,GAAG,EAAE,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,WAAW,CAAC,CAAC;IAExC,yBAAyB;IACzB,MAAM,kBAAkB,GAAG,cAAc,CAAC,IAAI,IAAI,gBAAgB,CAAC;IACnE,MAAM,GAAG,GAAG;QACV,CAAC,kBAAkB,CAAC,EAAE,CAAO,GAAG,IAAS,EAAE,EAAE;YAC3C,IAAI,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,QAAQ,GAAG,EAAE,CAAC;gBACd,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;oBACvB,IACE,OAAO,GAAG,KAAK,QAAQ;wBACvB,OAAO,GAAG,KAAK,QAAQ;wBACvB,GAAG,KAAK,SAAS;wBACjB,GAAG,KAAK,IAAI,EACZ,CAAC;wBACD,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;wBACxC,MAAM,KAAK,CACT,oBAAoB,kBAAkB,8BAA8B,aAAa,MAAM,GAAG,8GAA8G,CACzM,CAAC;oBACJ,CAAC;oBACD,QAAQ,IAAI,GAAG,CAAC;gBAClB,CAAC;YACH,CAAC;YAED,oBAAoB;YACpB,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACnC,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,4DAA4D;YAC5D,IAAI,cAAc,GAAG,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACnD,IAAI,cAAc,EAAE,CAAC;gBACnB,OAAO,cAAc,CAAC;YACxB,CAAC;YAED,6BAA6B;YAC7B,IAAI,OAAY,EAAE,MAAW,CAAC;YAC9B,cAAc,GAAG,IAAI,OAAO,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE;gBACjD,OAAO,GAAG,QAAQ,CAAC;gBACnB,MAAM,GAAG,OAAO,CAAC;YACnB,CAAC,CAAC,CAAC;YACH,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;YAE9C,uBAAuB;YACvB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,IAAI,CAAC,CAAC;gBAC7C,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAC5B,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACjC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAG,MAAM,CAAC,CAAC;YACpB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACjC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAG,KAAK,CAAC,CAAC;YAClB,CAAC;YAED,OAAO,cAAc,CAAC;QACxB,CAAC,CAAA;KACF,CAAC;IACF,OAAO,GAAG,CAAC,kBAAkB,CAAC,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,CAAC,cAAwB,EAAE,WAAgB,EAAE,EAAE;IAC9D,MAAM,CAAC,OAAO,cAAc,KAAK,UAAU,EAAE,wCAAwC,CAAC,CAAC;IACvF,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,WAAW,CAAC,CAAC;IAExC,yBAAyB;IACzB,MAAM,kBAAkB,GAAG,cAAc,CAAC,IAAI,IAAI,gBAAgB,CAAC;IACnE,MAAM,GAAG,GAAG;QACV,CAAC,kBAAkB,CAAC,EAAE,CAAC,GAAG,IAAS,EAAE,EAAE;YACrC,IAAI,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,QAAQ,GAAG,EAAE,CAAC;gBACd,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;oBACvB,IACE,OAAO,GAAG,KAAK,QAAQ;wBACvB,OAAO,GAAG,KAAK,QAAQ;wBACvB,GAAG,KAAK,SAAS;wBACjB,GAAG,KAAK,IAAI,EACZ,CAAC;wBACD,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;wBACxC,MAAM,KAAK,CACT,oBAAoB,kBAAkB,8BAA8B,aAAa,MAAM,GAAG,8GAA8G,CACzM,CAAC;oBACJ,CAAC;oBACD,QAAQ,IAAI,GAAG,CAAC;gBAClB,CAAC;YACH,CAAC;YAED,oBAAoB;YACpB,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACnC,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,uBAAuB;YACvB,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,IAAI,CAAC,CAAC;YACvC,IAAI,OAAO,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,CAAA,KAAK,UAAU,EAAE,CAAC;gBACvC,MAAM,KAAK,CACT,oBAAoB,kBAAkB,wEAAwE,CAC/G,CAAC;YACJ,CAAC;YACD,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC5B,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC;IACF,OAAO,GAAG,CAAC,kBAAkB,CAAC,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,OAAY,EAAE,aAAuB,EAAE,EAAE;;IACrE,KAAK,MAAM,SAAS,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,YAAY,EAAE,CAAC;QAC9C,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,YAAY,0CAAG,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,CAAC,KAAa,EAAE,EAAE,CACrE,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE,SAAS,CAAC,CAChD,CAAC;IACJ,CAAC;IACD,KAAK,MAAM,SAAS,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,cAAc,EAAE,CAAC;QAChD,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,cAAc,0CAAG,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,CAAC,KAAa,EAAE,EAAE,CACvE,aAAa,CAAC,KAAK,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAClD,CAAC;IACJ,CAAC;IACD,KAAK,MAAM,SAAS,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,oBAAoB,EAAE,CAAC;QACtD,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,oBAAoB,0CAAG,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,CAAC,KAAa,EAAE,EAAE,CAC7E,aAAa,CAAC,KAAK,EAAE,sBAAsB,EAAE,SAAS,CAAC,CACxD,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAG,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,CAAC,KAAa,EAAE,EAAE,CAC1D,aAAa,CAAC,KAAK,EAAE,eAAe,EAAE,SAAS,CAAC,CACjD,CAAC;IACJ,CAAC;IACD,KAAK,MAAM,SAAS,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,eAAe,EAAE,CAAC;QACjD,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,eAAe,0CAAG,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,CAAC,KAAa,EAAE,EAAE,CACxE,aAAa,CAAC,KAAK,EAAE,iBAAiB,EAAE,SAAS,CAAC,CACnD,CAAC;IACJ,CAAC;IACD,KAAK,MAAM,WAAW,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,cAAc,EAAE,CAAC;QAClD,KAAK,MAAM,SAAS,IAAI,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,cAAc,0CAAG,WAAW,CAAC,EAAE,CAAC;YAC/D,MAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,cAAc,0CAAG,WAAW,CAAC,0CAAG,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,CAAC,KAAa,EAAE,EAAE,CACtF,aAAa,CAAC,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,WAAW,CAAC,CAC/D,CAAC;QACJ,CAAC;IACH,CAAC;IACD,KAAK,MAAM,WAAW,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,aAAa,EAAE,CAAC;QACjD,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,aAAa,0CAAG,WAAW,EAAE,EAAE,CAAC,aAAa,EAAE,CAAC,KAAa,EAAE,EAAE,CACxE,aAAa,CAAC,KAAK,EAAE,eAAe,EAAE,WAAW,CAAC,CACnD,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,wBAAwB,GAAG,CAAC,OAAY,EAAE,aAAuB,EAAE,EAAE;;IACzE,KAAK,MAAM,QAAQ,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,YAAY,EAAE,CAAC;QAC7C,KAAK,MAAM,SAAS,IAAI,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,YAAY,0CAAG,QAAQ,CAAC,EAAE,CAAC;YAC1D,MAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,YAAY,0CAAG,QAAQ,CAAC,0CAAG,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,CAAC,KAAa,EAAE,EAAE,CACjF,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,CAAC,CAC1D,CAAC;QACJ,CAAC;IACH,CAAC;IACD,KAAK,MAAM,QAAQ,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,cAAc,EAAE,CAAC;QAC/C,KAAK,MAAM,SAAS,IAAI,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,cAAc,0CAAG,QAAQ,CAAC,EAAE,CAAC;YAC5D,MAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,cAAc,0CAAG,QAAQ,CAAC,0CAAG,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,CAAC,KAAa,EAAE,EAAE,CACnF,aAAa,CAAC,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,SAAS,CAAC,CAC5D,CAAC;QACJ,CAAC;IACH,CAAC;IACD,MAAM,cAAc,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAClD,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;QACtC,KAAK,MAAM,SAAS,IAAI,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAG,QAAQ,CAAC,EAAE,CAAC;YACnD,MAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAG,QAAQ,CAAC,0CAAG,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,CAAC,KAAa,EAAE,EAAE,CAC1E,aAAa,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,SAAS,CAAC,CAC3D,CAAC;QACJ,CAAC;IACH,CAAC;IACD,KAAK,MAAM,QAAQ,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,eAAe,EAAE,CAAC;QAChD,KAAK,MAAM,SAAS,IAAI,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,eAAe,0CAAG,QAAQ,CAAC,EAAE,CAAC;YAC7D,MAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,eAAe,0CAAG,QAAQ,CAAC,0CAAG,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,CAAC,KAAa,EAAE,EAAE,CACpF,aAAa,CAAC,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,SAAS,CAAC,CAC7D,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,SAAc,EAAE,EAAE;IAC3D,oDAAoD;IACpD,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC;QAC9C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,sFAAsF;IACtF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC;IAC/C,OAAO,UAAU,GAAG,SAAS,CAAC,SAAS,CAAC;AAC1C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,wBAInC,EAAE,+DAHF,QAAmB,EACnB,EAAE,eAAe,EAAE,cAAc,EAAO,EACxC,GAAQ;IAER,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,cAAc,EAAE,EAAE,GAAG,CAAC,CAAC,CAC7F,CAAC;IACF,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,OAAO,aAAa,CAAC;AACvB,CAAC,CAAA,CAAC;AAEF,MAAM,8BAA8B,GAA4C,EAAE,CAAC;AACnF,MAAM,CAAC,MAAM,cAAc,GAAG,uBAI5B,EAAE,8DAHF,OAAgB,EAChB,EAAE,eAAe,EAAE,cAAc,KAAU,EAAE,EAC7C,GAAQ;IAER,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC3C,IAAI,cAAc,KAAK,SAAS,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;QAC5D,cAAc,GAAG,IAAI,CAAC;IACxB,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,8BAA8B,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC7D,OAAO,CAAC,GAAG,CACT,cAAc,OAAO,CAAC,gBAAgB,yFAAyF,CAChI,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,eAAe,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,cAAc,EAAE,CAAC;YACnB,8BAA8B,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;QAClE,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QACtD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAA,CAAC;AAEF,MAAM,eAAe,GAAG,uBAItB,EAAE,8DAHF,OAAgB,EAChB,EAAE,eAAe,EAAE,cAAc,KAAU,EAAE,EAC7C,GAAQ;;IAER,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC3C,IAAI,cAAc,KAAK,SAAS,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;QAC5D,cAAc,GAAG,IAAI,CAAC;IACxB,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,uBAAuB,GAAG,0BAA0B,CAAC,OAAO,CAAC,CAAC;IACpE,IAAI,uBAAuB,IAAI,8BAA8B,CAAC,uBAAuB,CAAC,EAAE,CAAC;QACvF,OAAO,CAAC,GAAG,CACT,cAAc,uBAAuB,yFAAyF,CAC/H,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,cAAc,GAAU,MAAM,CAAC,MAAM,CAAC,CAAA,MAAA,OAAO,CAAC,OAAO,0CAAE,KAAK,KAAI,EAAE,CAAC,CAAC;IAC1E,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,SAAc,EAAE,EAAE,CAAC,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,QAAQ,KAAI,EAAE,CAAC,CAAC;IACtF,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC9C,MAAM,eAAe,GAAG,mCAAmC,CAAC,KAAK,CAAY,CAAC;QAC9E,eAAe,CAAC,gBAAgB;YAC9B,0BAA0B,CAAC,eAAe,CAAC,IAAI,uBAAuB,CAAC;QACzE,OAAO,eAAe,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,oBAAoB;IACpB,KAAK,MAAM,KAAK,IAAI,iBAAiB,EAAE,CAAC;QACtC,IACE,CAAC,+BAA+B,CAC9B,0BAA0B,CAAC,KAAK,CAAC,EACjC,uBAAuB,CACxB;YACD,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,GAAG,CAAC;YACjC,KAAK,CAAC,SAAS,KAAK,OAAO,CAAC,GAAG,EAC/B,CAAC;YACD,IAAI,cAAc,IAAI,uBAAuB,EAAE,CAAC;gBAC9C,8BAA8B,CAAC,uBAAuB,CAAC,GAAG,IAAI,CAAC;YACjE,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE;gBAC7B,OAAO,EAAE,KAAK;gBACd,KAAK,EACH,4JAA4J;aAC/J,CAAC,CAAC;YACH,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAC/C,cAAc,CAAC,KAAK,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,CAC7E,CAAC;QACF,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,IAAI,cAAc,IAAI,uBAAuB,EAAE,CAAC;YAC9C,8BAA8B,CAAC,uBAAuB,CAAC,GAAG,IAAI,CAAC;QACjE,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QACtD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAA,CAAC;AAEF,MAAM,KAAK,GAAG;IACZ,KAAK;IACL,KAAK;IACL,oBAAoB;IACpB,IAAI;IACJ,QAAQ;IACR,aAAa,EAAE,CAAC,CAAM,EAAE,CAAO,EAAO,EAAE,GAAE,CAAC;IAC3C,8CAA8C;IAC9C,uBAAuB,EAAE,IAAI;IAC7B,uBAAuB,EAAE,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;IAC5C,oBAAoB;IACpB,wBAAwB;IACxB,0BAA0B;IAC1B,cAAc;IACd,qBAAqB;IACrB,eAAe;CAChB,CAAC;AAEF,MAAM,aAAa,GAAG,CAAO,eAAoB,EAAE,OAAa,EAAE,EAAE;IAClE,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACpE,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,eAAe,EAAE,CAAC;YACpC,OAAO,GAAG,CAAC;QACb,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,gCAAgC,OAAO,EAAE,CAAC,CAAC,CAAC;YACxE,MAAM,MAAM,GAAG,CAAC,CAAC;YACjB,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,uBAAuB,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;YACtF,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAC3D,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;AACH,CAAC,CAAA,CAAC;AACF,KAAK,CAAC,aAAa,GAAG,aAAa,CAAC;AAEpC,eAAe,KAAK,CAAC","sourcesContent":["import assert from \"assert\";\nimport QuickLru from \"quick-lru\";\nimport Logger from \"@pkcprotocol/pkc-logger\";\nimport PkcJs from \"../pkc-js\";\nimport { Comment } from \"../../types\";\nimport { areEquivalentCommunityAddresses } from \"../community-address\";\nimport { getCommentCommunityAddress, normalizePublicationOptionsForStore } from \"../pkc-compat\";\nimport { getPageRpcClients } from \"../pkc-compat\";\nconst log = Logger(\"bitsocial-react-hooks:utils\");\n\nconst merge = (...args: any) => {\n // @ts-ignore\n const clonedArgs = args.map((arg) => {\n assert(arg && typeof arg === \"object\", `utils.merge argument '${arg}' not an object`);\n return clone(arg);\n });\n const mergedObj: any = {};\n while (clonedArgs.length) {\n const currentArg = clonedArgs.shift();\n for (const i in currentArg) {\n if (currentArg[i] === undefined || currentArg[i] === null) {\n continue;\n }\n mergedObj[i] = currentArg[i];\n }\n }\n return mergedObj;\n};\n\nconst clone = (obj: any) => {\n assert(obj && typeof obj === \"object\", `utils.clone argument '${obj}' not an object`);\n let clonedObj: any = {};\n\n // clean the object to be cloned\n for (const i in obj) {\n // remove functions\n if (typeof obj[i] === \"function\") {\n continue;\n }\n // remove internal props\n if (i.startsWith(\"_\")) {\n continue;\n }\n if (obj[i] === undefined || obj[i] === null) {\n continue;\n }\n // pkc-js has a bug where pkc instances have circular deps\n if (obj[i]?.constructor?.name === \"PKC\") {\n continue;\n }\n clonedObj[i] = obj[i];\n }\n\n // clone the object\n clonedObj = JSON.parse(JSON.stringify(clonedObj));\n return clonedObj;\n};\n\n// this function should not clone the comments to not waste memory\nexport const flattenCommentsPages = (pageInstanceOrPagesInstance: any) => {\n const flattenedComments = [];\n\n // if is a Page instance\n if (pageInstanceOrPagesInstance?.comments) {\n for (const comment of pageInstanceOrPagesInstance.comments) {\n flattenedComments.push(comment);\n if (comment.replies?.pages && Object.keys(comment.replies.pages).length) {\n flattenedComments.push(...flattenCommentsPages(comment.replies));\n }\n }\n }\n\n // if is a Pages instance\n else if (pageInstanceOrPagesInstance?.pages) {\n for (const sortType in pageInstanceOrPagesInstance.pages) {\n flattenedComments.push(...flattenCommentsPages(pageInstanceOrPagesInstance.pages[sortType]));\n }\n }\n\n // if is a Pages.pages instance\n else {\n for (const sortType in pageInstanceOrPagesInstance) {\n const page = pageInstanceOrPagesInstance[sortType];\n if (page?.comments?.length) {\n flattenedComments.push(...flattenCommentsPages(page));\n }\n }\n }\n\n // remove duplicate comments\n const flattenedCommentsObject = {};\n for (const comment of flattenedComments) {\n // @ts-ignore\n flattenedCommentsObject[comment.cid] = comment;\n }\n const uniqueFlattened = [];\n for (const cid in flattenedCommentsObject) {\n // @ts-ignore\n uniqueFlattened.push(flattenedCommentsObject[cid]);\n }\n\n return uniqueFlattened;\n};\n\nconst memo = (functionToMemo: Function, memoOptions: any) => {\n assert(typeof functionToMemo === \"function\", `memo first argument must be a function`);\n const pendingPromises: any = new Map();\n const cache = new QuickLru(memoOptions);\n\n // preserve function name\n const memoedFunctionName = functionToMemo.name || \"memoedFunction\";\n const obj = {\n [memoedFunctionName]: async (...args: any) => {\n let cacheKey = args[0];\n if (args.length > 1) {\n cacheKey = \"\";\n for (const arg of args) {\n if (\n typeof arg !== \"string\" &&\n typeof arg !== \"number\" &&\n arg !== undefined &&\n arg !== null\n ) {\n const argumentIndex = args.indexOf(arg);\n throw Error(\n `memoed function '${memoedFunctionName}' invalid argument number '${argumentIndex}' '${arg}', memoed function can only use multiple arguments if they are all of type string, number, undefined or null`,\n );\n }\n cacheKey += arg;\n }\n }\n\n // has cached result\n const cached = cache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n // don't request the same thing twice if fetching is pending\n let pendingPromise = pendingPromises.get(cacheKey);\n if (pendingPromise) {\n return pendingPromise;\n }\n\n // create the pending promise\n let resolve: any, reject: any;\n pendingPromise = new Promise((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n pendingPromises.set(cacheKey, pendingPromise);\n\n // execute the function\n try {\n const result = await functionToMemo(...args);\n cache.set(cacheKey, result);\n pendingPromises.delete(cacheKey);\n resolve?.(result);\n } catch (error) {\n pendingPromises.delete(cacheKey);\n reject?.(error);\n }\n\n return pendingPromise;\n },\n };\n return obj[memoedFunctionName];\n};\n\nconst memoSync = (functionToMemo: Function, memoOptions: any) => {\n assert(typeof functionToMemo === \"function\", `memo first argument must be a function`);\n const cache = new QuickLru(memoOptions);\n\n // preserve function name\n const memoedFunctionName = functionToMemo.name || \"memoedFunction\";\n const obj = {\n [memoedFunctionName]: (...args: any) => {\n let cacheKey = args[0];\n if (args.length > 1) {\n cacheKey = \"\";\n for (const arg of args) {\n if (\n typeof arg !== \"string\" &&\n typeof arg !== \"number\" &&\n arg !== undefined &&\n arg !== null\n ) {\n const argumentIndex = args.indexOf(arg);\n throw Error(\n `memoed function '${memoedFunctionName}' invalid argument number '${argumentIndex}' '${arg}', memoed function can only use multiple arguments if they are all of type string, number, undefined or null`,\n );\n }\n cacheKey += arg;\n }\n }\n\n // has cached result\n const cached = cache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n // execute the function\n const result = functionToMemo(...args);\n if (typeof result?.then === \"function\") {\n throw Error(\n `memoed function '${memoedFunctionName}' is an async function, cannot be used with memoSync, use memo instead`,\n );\n }\n cache.set(cacheKey, result);\n return result;\n },\n };\n return obj[memoedFunctionName];\n};\n\nconst clientsOnStateChange = (clients: any, onStateChange: Function) => {\n for (const clientUrl in clients?.ipfsGateways) {\n clients?.ipfsGateways?.[clientUrl].on(\"statechange\", (state: string) =>\n onStateChange(state, \"ipfsGateways\", clientUrl),\n );\n }\n for (const clientUrl in clients?.kuboRpcClients) {\n clients?.kuboRpcClients?.[clientUrl].on(\"statechange\", (state: string) =>\n onStateChange(state, \"kuboRpcClients\", clientUrl),\n );\n }\n for (const clientUrl in clients?.pubsubKuboRpcClients) {\n clients?.pubsubKuboRpcClients?.[clientUrl].on(\"statechange\", (state: string) =>\n onStateChange(state, \"pubsubKuboRpcClients\", clientUrl),\n );\n }\n const rpcClients = getPageRpcClients(clients);\n for (const clientUrl in rpcClients) {\n rpcClients?.[clientUrl].on(\"statechange\", (state: string) =>\n onStateChange(state, \"pkcRpcClients\", clientUrl),\n );\n }\n for (const clientUrl in clients?.libp2pJsClients) {\n clients?.libp2pJsClients?.[clientUrl].on(\"statechange\", (state: string) =>\n onStateChange(state, \"libp2pJsClients\", clientUrl),\n );\n }\n for (const chainTicker in clients?.chainProviders) {\n for (const clientUrl in clients?.chainProviders?.[chainTicker]) {\n clients?.chainProviders?.[chainTicker]?.[clientUrl].on(\"statechange\", (state: string) =>\n onStateChange(state, \"chainProviders\", clientUrl, chainTicker),\n );\n }\n }\n for (const resolverKey in clients?.nameResolvers) {\n clients?.nameResolvers?.[resolverKey].on(\"statechange\", (state: string) =>\n onStateChange(state, \"nameResolvers\", resolverKey),\n );\n }\n};\n\nconst pageClientsOnStateChange = (clients: any, onStateChange: Function) => {\n for (const sortType in clients?.ipfsGateways) {\n for (const clientUrl in clients?.ipfsGateways?.[sortType]) {\n clients?.ipfsGateways?.[sortType]?.[clientUrl].on(\"statechange\", (state: string) =>\n onStateChange(state, \"ipfsGateways\", sortType, clientUrl),\n );\n }\n }\n for (const sortType in clients?.kuboRpcClients) {\n for (const clientUrl in clients?.kuboRpcClients?.[sortType]) {\n clients?.kuboRpcClients?.[sortType]?.[clientUrl].on(\"statechange\", (state: string) =>\n onStateChange(state, \"kuboRpcClients\", sortType, clientUrl),\n );\n }\n }\n const rpcPageClients = getPageRpcClients(clients);\n for (const sortType in rpcPageClients) {\n for (const clientUrl in rpcPageClients?.[sortType]) {\n rpcPageClients?.[sortType]?.[clientUrl].on(\"statechange\", (state: string) =>\n onStateChange(state, \"pkcRpcClients\", sortType, clientUrl),\n );\n }\n }\n for (const sortType in clients?.libp2pJsClients) {\n for (const clientUrl in clients?.libp2pJsClients?.[sortType]) {\n clients?.libp2pJsClients?.[sortType]?.[clientUrl].on(\"statechange\", (state: string) =>\n onStateChange(state, \"libp2pJsClients\", sortType, clientUrl),\n );\n }\n }\n};\n\nexport const communityPostsCacheExpired = (community: any) => {\n // NOTE: fetchedAt is undefined on owner communities\n if (!community || community.fetchedAt == null) {\n return false;\n }\n // if community cache is older than 1 hour, its community.posts are considered expired\n const oneHourAgo = Date.now() / 1000 - 60 * 60;\n return oneHourAgo > community.fetchedAt;\n};\n\nexport const removeInvalidComments = async (\n comments: Comment[],\n { validateReplies, blockCommunity }: any,\n pkc: any,\n) => {\n if (!comments.length) {\n return [];\n }\n const isValid = await Promise.all(\n comments.map((comment) => commentIsValid(comment, { validateReplies, blockCommunity }, pkc)),\n );\n const validComments = comments.filter((_, i) => isValid[i]);\n return validComments;\n};\n\nconst communitiesWithInvalidComments: { [communityAddress: string]: boolean } = {};\nexport const commentIsValid = async (\n comment: Comment,\n { validateReplies, blockCommunity }: any = {},\n pkc: any,\n) => {\n validateReplies = Boolean(validateReplies);\n if (blockCommunity === undefined || blockCommunity === null) {\n blockCommunity = true;\n }\n if (!comment) {\n return false;\n }\n if (communitiesWithInvalidComments[comment.communityAddress]) {\n console.log(\n `community '${comment.communityAddress}' had an invalid comment, invalidate all its future comments to avoid wasting resources`,\n );\n return false;\n }\n try {\n await pkc.validateComment(comment, { validateReplies });\n } catch (e) {\n if (blockCommunity) {\n communitiesWithInvalidComments[comment.communityAddress] = true;\n }\n console.log(\"invalid comment\", { comment, error: e });\n return false;\n }\n return true;\n};\n\nconst repliesAreValid = async (\n comment: Comment,\n { validateReplies, blockCommunity }: any = {},\n pkc: any,\n) => {\n validateReplies = Boolean(validateReplies);\n if (blockCommunity === undefined || blockCommunity === null) {\n blockCommunity = true;\n }\n if (!comment) {\n return false;\n }\n const commentCommunityAddress = getCommentCommunityAddress(comment);\n if (commentCommunityAddress && communitiesWithInvalidComments[commentCommunityAddress]) {\n console.log(\n `community '${commentCommunityAddress}' had an invalid comment, invalidate all its future comments to avoid wasting resources`,\n );\n return false;\n }\n const replyPageArray: any[] = Object.values(comment.replies?.pages || {});\n const replies = replyPageArray.flatMap((replyPage: any) => replyPage?.comments || []);\n const normalizedReplies = replies.map((reply) => {\n const normalizedReply = normalizePublicationOptionsForStore(reply) as Comment;\n normalizedReply.communityAddress =\n getCommentCommunityAddress(normalizedReply) || commentCommunityAddress;\n return normalizedReply;\n });\n\n // manual validation\n for (const reply of normalizedReplies) {\n if (\n !areEquivalentCommunityAddresses(\n getCommentCommunityAddress(reply),\n commentCommunityAddress,\n ) ||\n reply.depth !== comment.depth + 1 ||\n reply.parentCid !== comment.cid\n ) {\n if (blockCommunity && commentCommunityAddress) {\n communitiesWithInvalidComments[commentCommunityAddress] = true;\n }\n console.log(\"invalid comment\", {\n comment: reply,\n error:\n \"!areEquivalentCommunityAddresses(reply.communityAddress, comment.communityAddress) || reply.depth !== comment.depth + 1 || reply.parentCid !== comment.cid\",\n });\n return false;\n }\n }\n\n // signature verification\n try {\n const promises = normalizedReplies.map((reply) =>\n commentIsValid(reply, { validateReplies: false, blockCommunity: true }, pkc),\n );\n await Promise.all(promises);\n } catch (e: any) {\n if (blockCommunity && commentCommunityAddress) {\n communitiesWithInvalidComments[commentCommunityAddress] = true;\n }\n console.log(\"invalid comment\", { comment, error: e });\n return false;\n }\n return true;\n};\n\nconst utils = {\n merge,\n clone,\n flattenCommentsPages,\n memo,\n memoSync,\n retryInfinity: (f: any, o?: any): any => {},\n // export timeout values to mock them in tests\n retryInfinityMinTimeout: 1000,\n retryInfinityMaxTimeout: 1000 * 60 * 60 * 24,\n clientsOnStateChange,\n pageClientsOnStateChange,\n communityPostsCacheExpired,\n commentIsValid,\n removeInvalidComments,\n repliesAreValid,\n};\n\nconst retryInfinity = async (functionToRetry: any, options?: any) => {\n const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n let attempt = 0;\n while (true) {\n try {\n const res = await functionToRetry();\n return res;\n } catch (e) {\n options?.onError(e || Error(`retryInfinity failed attempt ${attempt}`));\n const factor = 2;\n let timeout = Math.round(utils.retryInfinityMinTimeout * Math.pow(factor, attempt++));\n timeout = Math.min(timeout, utils.retryInfinityMaxTimeout);\n await sleep(timeout);\n }\n }\n};\nutils.retryInfinity = retryInfinity;\n\nexport default utils;\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
declare const validator: {
|
|
2
|
+
validateAccountsActionsPublishCommentArguments: ({ publishCommentOptions, accountName, account, }: any) => void;
|
|
3
|
+
validateAccountsActionsPublishCommentEditArguments: ({ publishCommentEditOptions, accountName, account, }: any) => void;
|
|
4
|
+
validateAccountsActionsPublishCommentModerationArguments: ({ publishCommentModerationOptions, accountName, account, }: any) => void;
|
|
5
|
+
validateAccountsActionsPublishCommunityEditArguments: ({ communityAddress, publishCommunityEditOptions, accountName, account, }: any) => void;
|
|
6
|
+
validateAccountsActionsPublishVoteArguments: ({ publishVoteOptions, accountName, account, }: any) => void;
|
|
7
|
+
validateAccountsActionsExportAccountArguments: (accountName: any) => void;
|
|
8
|
+
validateAccountsActionsSetAccountsOrderArguments: (newOrderedAccountNames: any, accountNames: any) => void;
|
|
9
|
+
validateAccountsActionsSetAccountArguments: (account: any) => void;
|
|
10
|
+
validateAccountsActionsSetActiveAccountArguments: (accountName: any) => void;
|
|
11
|
+
validateAccountsDatabaseAddAccountArguments: (account: any) => void;
|
|
12
|
+
validateAccountsDatabaseGetAccountsArguments: (accountIds: any) => void;
|
|
13
|
+
validateAccountsDatabaseAccountNames: (accountNames: any) => void;
|
|
14
|
+
validateUseCommentArguments: (commentCid: any, account: any) => void;
|
|
15
|
+
validateUseCommentsArguments: (commentCids: any, account: any) => void;
|
|
16
|
+
validateUseCommunityArguments: ({ community, communityAddress, account }: any) => void;
|
|
17
|
+
validateUseCommunityStatsArguments: ({ community, communityAddress }: any) => void;
|
|
18
|
+
validateUseCommunitiesArguments: ({ communities, communityRefs, communityAddresses, account, }: any) => void;
|
|
19
|
+
validateUseCommunitiesStatesArguments: ({ communities, communityRefs, communityAddresses, }: any) => void;
|
|
20
|
+
validateFeedSortType: (sortType: any) => void;
|
|
21
|
+
validateUseFeedArguments: ({ communities, communityRefs, communityAddresses, sortType, accountName, postsPerPage, filter, newerThan, accountComments, }: any) => void;
|
|
22
|
+
validateUseBufferedFeedsArguments: ({ feedsOptions, accountName, }: {
|
|
23
|
+
feedsOptions?: any;
|
|
24
|
+
accountName?: any;
|
|
25
|
+
}) => void;
|
|
26
|
+
validateRepliesSortType: (sortType: any) => void;
|
|
27
|
+
validateUseRepliesArguments: (comment?: any, sortType?: any, accountName?: any, onlyIfCached?: any, flat?: any, accountComments?: any, postsPerPage?: any, filter?: any) => void;
|
|
28
|
+
};
|
|
29
|
+
export default validator;
|
|
30
|
+
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/lib/validator.ts"],"names":[],"mappings":"AA0qBA,QAAA,MAAM,SAAS;uGAppBZ,GAAG;+GAwHH,GAAG;2HA4CH,GAAG;qIAoDH,GAAG;iGAlJH,GAAG;iEAyL8D,GAAG;+EAS7C,GAAG,gBACb,GAAG;0DAQ0C,GAAG;oEAWO,GAAG;2DAuCZ,GAAG;+DA/BC,GAAG;yDAkBT,GAAG;8CA8Bd,GAAG,WAAW,GAAG;gDAQf,GAAG,WAAW,GAAG;8EAgCa,GAAG;0EAUP,GAAG;oGAqC7E,GAAG;iGAkJH,GAAG;qCAvHkC,GAAG;6JAaxC,GAAG;wEA0CH;QACD,YAAY,CAAC,EAAE,GAAG,CAAC;QACnB,WAAW,CAAC,EAAE,GAAG,CAAC;KACnB;wCAmF0C,GAAG;4CAIlC,GAAG,aACF,GAAG,gBACA,GAAG,iBACF,GAAG,SACX,GAAG,oBACQ,GAAG,iBACN,GAAG,WACT,GAAG;CA8Eb,CAAC;AAEF,eAAe,SAAS,CAAC"}
|