Fix empty board loading state and browser P2P patch (#1175)

* fix(board): show loaded empty boards

* fix(p2p): patch browser hooks runtime

* fix(board): stop flash loading for explicit empty boards

* fix(board): wait for feed on preloaded empty pages
This commit is contained in:
Tommaso Casaburi
2026-06-18 18:54:48 +07:00
committed by GitHub
parent 9896c4400b
commit eb47214f08
9 changed files with 821 additions and 240 deletions
@@ -1,89 +0,0 @@
diff --git a/dist/browser/helia/helia-for-pkc.js b/dist/browser/helia/helia-for-pkc.js
index e6821667b0601ac56a850e989bfedf76c14796a2..87d84a502bdbf72b8cf22b7a8ac6bd68e542c611 100644
--- a/dist/browser/helia/helia-for-pkc.js
+++ b/dist/browser/helia/helia-for-pkc.js
@@ -145,6 +145,11 @@ export async function createLibp2pJsClientOrUseExistingOne(pkcOptions) {
warmupPromisesByTopic.set(topic, p);
return p;
};
+ const ignoreBestEffortPubsubWarmupError = (operation, topic, err, options) => {
+ if (options?.signal?.aborted)
+ throw err;
+ log.error(`Best-effort pubsub peer warmup failed before ${operation} on topic`, topic, err);
+ };
const throwIfHeliaIsStoppingOrStopped = () => {
if (helia.libp2p.status === "stopped" || helia.libp2p.status === "stopping")
throw new PKCError("ERR_HELIAS_STOPPING_OR_STOPPED", {
@@ -290,8 +295,13 @@ export async function createLibp2pJsClientOrUseExistingOne(pkcOptions) {
if (!wasAlreadySubscribed)
helia.libp2p.services.pubsub.subscribe(topic);
try {
- await warmupForTopic(topic, options);
- const res = await helia.libp2p.services.pubsub.publish(topic, data);
+ try {
+ await warmupForTopic(topic, options);
+ }
+ catch (err) {
+ ignoreBestEffortPubsubWarmupError("publish", topic, err, options);
+ }
+ const res = await helia.libp2p.services.pubsub.publish(topic, data, { allowPublishToZeroTopicPeers: true });
log("Published new data to pubsub topic (string, e.g. community address)", topic, "Direct gossipsub recipients (libp2p peer IDs, NOT signer/community addresses):", res.recipients.map((p) => p.toString()));
}
finally {
@@ -314,7 +324,12 @@ export async function createLibp2pJsClientOrUseExistingOne(pkcOptions) {
// locally subscribed to).
const warmupPromise = warmupForTopic(topic, options);
helia.libp2p.services.pubsub.subscribe(topic);
- await warmupPromise;
+ try {
+ await warmupPromise;
+ }
+ catch (err) {
+ ignoreBestEffortPubsubWarmupError("subscribe", topic, err, options);
+ }
},
unsubscribe: async (topic, handler, options) => {
throwIfHeliaIsStoppingOrStopped();
diff --git a/dist/browser/publications/publication.js b/dist/browser/publications/publication.js
index 5e17c02a39c2715c7ac932695fe90d5078bce405..8c61955ee6ef6dd353e57584b4aaf745e143f6d4 100644
--- a/dist/browser/publications/publication.js
+++ b/dist/browser/publications/publication.js
@@ -842,8 +842,14 @@ class Publication extends TypedEmitter {
await new Promise((resolve) => setTimeout(resolve, this._setProviderFailureThresholdSeconds * 1000));
if (this._isAllAttemptsExhausted(providers.length)) {
await this._postSucessOrFailurePublishing();
- const allAttemptsFailedError = new PKCError("ERR_ALL_PUBSUB_PROVIDERS_THROW_ERRORS", {
- challengeExchanges: this._challengeExchangesFormattedForErrors(),
+ const challengeExchanges = this._challengeExchangesFormattedForErrors();
+ const didEveryAttemptThrow = challengeExchanges.length > 0 &&
+ challengeExchanges.every((exchange) => exchange.challengeRequestPublishError);
+ const allAttemptsFailedError = new PKCError(didEveryAttemptThrow
+ ? "ERR_ALL_PUBSUB_PROVIDERS_THROW_ERRORS"
+ : "ERR_PUBSUB_DID_NOT_RECEIVE_RESPONSE_AFTER_PUBLISHING_CHALLENGE_REQUEST", {
+ challengeExchanges,
+ publishToDifferentProviderThresholdSeconds: this._publishToDifferentProviderThresholdSeconds,
pubsubTopic: this._communityPubsubTopicWithFallback(),
providerHeliaContexts: this._libp2pJsClientHeliaContexts()
});
diff --git a/dist/browser/runtime/browser/libp2p-extra-transports.js b/dist/browser/runtime/browser/libp2p-extra-transports.js
index 1b7028978d1da8c3f78e9b4d18e790a3ad025e25..2b8eff3ce509cff57ac5be3d31b26b38a5301a52 100644
--- a/dist/browser/runtime/browser/libp2p-extra-transports.js
+++ b/dist/browser/runtime/browser/libp2p-extra-transports.js
@@ -1,3 +1,4 @@
-const extraLibp2pTransports = [];
+import { webTransport } from "@libp2p/webtransport";
+const extraLibp2pTransports = typeof globalThis.WebTransport === "function" ? [webTransport()] : [];
export default extraLibp2pTransports;
//# sourceMappingURL=libp2p-extra-transports.js.map
diff --git a/package.json b/package.json
index 2a44f27220191ee556a317bf25005b7fcbde6aaa..335ee82cc7e9850eb1bc036b2a481ae5a575eabd 100644
--- a/package.json
+++ b/package.json
@@ -78,6 +78,7 @@
"@libp2p/identify": "4.1.3",
"@libp2p/interface": "3.2.2",
"@libp2p/peer-id": "6.0.8",
+ "@libp2p/webtransport": "6.0.0",
"@multiformats/multiaddr": "13.0.1",
"@noble/curves": "2.2.0",
"@pkcprotocol/pkc-logger": "0.1.0",
@@ -0,0 +1,167 @@
diff --git a/dist/browser/community/community-client-manager.js b/dist/browser/community/community-client-manager.js
index 8b45a48e22aff3ff5c0f9f0a30408fd63dfe40a4..9356e89aca5a84eae0c13a790b2fdbfff88604ca 100644
--- a/dist/browser/community/community-client-manager.js
+++ b/dist/browser/community/community-client-manager.js
@@ -16,6 +16,7 @@ import { CID } from "kubo-rpc-client";
import { getAuthorNameFromRuntime } from "../publications/publication-author.js";
import { selectWinningGatewayCommunity } from "./community-gateway-selection.js";
export const MAX_FILE_SIZE_BYTES_FOR_COMMUNITY_IPFS = 1024 * 1024; // 1mb
+const BROWSER_P2P_GATEWAY_FALLBACK_IPNS_TIMEOUT_MS = 15000;
export class CommunityClientsManager extends PKCClientsManager {
constructor(community) {
super(community._pkc);
@@ -378,22 +379,37 @@ export class CommunityClientsManager extends PKCClientsManager {
let subRes;
const areWeConnectedToKuboOrHelia = Object.keys(this._pkc.clients.kuboRpcClients).length > 0 || Object.keys(this._pkc.clients.libp2pJsClients).length > 0;
if (areWeConnectedToKuboOrHelia) {
+ const log = Logger("pkc-js:remote-community:update");
const kuboRpcOrHelia = this.getDefaultKuboRpcClientOrHelia();
+ const canFallbackToGateways = Object.keys(this._pkc.clients.ipfsGateways).length > 0;
+ const p2pIpnsTimeoutMs = canFallbackToGateways && "_helia" in kuboRpcOrHelia
+ ? Math.min(this._pkc._timeouts["community-ipns"], BROWSER_P2P_GATEWAY_FALLBACK_IPNS_TIMEOUT_MS)
+ : this._pkc._timeouts["community-ipns"];
// we're connected to kubo or helia
try {
- subRes = await this._fetchCommunityIpnsP2PAndVerify(ipnsName);
+ subRes = await this._fetchCommunityIpnsP2PAndVerify(ipnsName, p2pIpnsTimeoutMs);
}
catch (e) {
- //@ts-expect-error
- e.details = {
+ if (canFallbackToGateways && !this._community._getStopAbortSignal()?.aborted) {
+ log.error("Falling back to gateways after browser P2P community IPNS fetch failed", {
+ communityAddress,
+ ipnsName,
+ error: e
+ });
+ subRes = await this._fetchCommunityFromGateways(ipnsName);
+ }
+ else {
//@ts-expect-error
- ...e.details,
- ipnsName,
- communityAddress,
- ipnsPubsubTopic: this._community.ipnsPubsubTopic,
- ipnsPubsubTopicRoutingCid: this._community.ipnsPubsubTopicRoutingCid
- };
- throw e;
+ e.details = {
+ //@ts-expect-error
+ ...e.details,
+ ipnsName,
+ communityAddress,
+ ipnsPubsubTopic: this._community.ipnsPubsubTopic,
+ ipnsPubsubTopicRoutingCid: this._community.ipnsPubsubTopicRoutingCid
+ };
+ throw e;
+ }
}
finally {
if ("_helia" in kuboRpcOrHelia)
@@ -425,7 +441,7 @@ export class CommunityClientsManager extends PKCClientsManager {
return subRes;
});
}
- async _fetchCommunityIpnsP2PAndVerify(ipnsName) {
+ async _fetchCommunityIpnsP2PAndVerify(ipnsName, timeoutMs = this._pkc._timeouts["community-ipns"]) {
const log = Logger("pkc-js:clients-manager:_fetchCommunityIpnsP2PAndVerify");
const kuboRpcOrHelia = this.getDefaultKuboRpcClientOrHelia();
if ("_helia" in kuboRpcOrHelia) {
@@ -434,7 +450,7 @@ export class CommunityClientsManager extends PKCClientsManager {
else
this.updateKuboRpcState("fetching-ipns", kuboRpcOrHelia.url);
const { cid: latestCommunityCid, ipnsHops } = await this.resolveIpnsToCidP2P(ipnsName, {
- timeoutMs: this._pkc._timeouts["community-ipns"],
+ timeoutMs,
abortSignal: this._community._getStopAbortSignal()
});
// ipnsHops[0] is the anchor (== ipnsName), ipnsHops.at(-1) is the terminal name whose
diff --git a/dist/browser/helia/helia-for-pkc.js b/dist/browser/helia/helia-for-pkc.js
index 3eca64dd532a19393c55ddf953dfd4ef207c65f8..683fed56722effc54b1b08e5b050e311ed174424 100644
--- a/dist/browser/helia/helia-for-pkc.js
+++ b/dist/browser/helia/helia-for-pkc.js
@@ -161,6 +161,11 @@ export async function createLibp2pJsClientOrUseExistingOne(pkcOptions) {
warmupPromisesByTopic.set(topic, p);
return p;
};
+ const ignoreBestEffortPubsubWarmupError = (operation, topic, err, options) => {
+ if (options?.signal?.aborted)
+ throw err;
+ log.error(`Best-effort pubsub peer warmup failed before ${operation} on topic`, topic, err);
+ };
const throwIfHeliaIsStoppingOrStopped = () => {
if (helia.libp2p.status === "stopped" || helia.libp2p.status === "stopping")
throw new PKCError("ERR_HELIAS_STOPPING_OR_STOPPED", {
@@ -299,8 +304,13 @@ export async function createLibp2pJsClientOrUseExistingOne(pkcOptions) {
if (!wasAlreadySubscribed)
helia.libp2p.services.pubsub.subscribe(topic);
try {
- await warmupForTopic(topic, options);
- const res = await helia.libp2p.services.pubsub.publish(topic, data);
+ try {
+ await warmupForTopic(topic, options);
+ }
+ catch (err) {
+ ignoreBestEffortPubsubWarmupError("publish", topic, err, options);
+ }
+ const res = await helia.libp2p.services.pubsub.publish(topic, data, { allowPublishToZeroTopicPeers: true });
log("Published new data to pubsub topic (string, e.g. community address)", topic, "Direct gossipsub recipients (libp2p peer IDs, NOT signer/community addresses):", res.recipients.map((p) => p.toString()));
}
finally {
@@ -323,7 +333,12 @@ export async function createLibp2pJsClientOrUseExistingOne(pkcOptions) {
// locally subscribed to).
const warmupPromise = warmupForTopic(topic, options);
helia.libp2p.services.pubsub.subscribe(topic);
- await warmupPromise;
+ try {
+ await warmupPromise;
+ }
+ catch (err) {
+ ignoreBestEffortPubsubWarmupError("subscribe", topic, err, options);
+ }
},
unsubscribe: async (topic, handler, options) => {
throwIfHeliaIsStoppingOrStopped();
diff --git a/dist/browser/publications/publication.js b/dist/browser/publications/publication.js
index 5e17c02a39c2715c7ac932695fe90d5078bce405..2d43d996e2b3cdab759e89c296eb9ed8aae857db 100644
--- a/dist/browser/publications/publication.js
+++ b/dist/browser/publications/publication.js
@@ -842,8 +842,14 @@ class Publication extends TypedEmitter {
await new Promise((resolve) => setTimeout(resolve, this._setProviderFailureThresholdSeconds * 1000));
if (this._isAllAttemptsExhausted(providers.length)) {
await this._postSucessOrFailurePublishing();
- const allAttemptsFailedError = new PKCError("ERR_ALL_PUBSUB_PROVIDERS_THROW_ERRORS", {
- challengeExchanges: this._challengeExchangesFormattedForErrors(),
+ const challengeExchanges = this._challengeExchangesFormattedForErrors();
+ const didEveryAttemptThrow = challengeExchanges.length > 0 &&
+ challengeExchanges.every((exchange) => exchange.challengeRequestPublishError);
+ const allAttemptsFailedError = new PKCError(didEveryAttemptThrow
+ ? "ERR_ALL_PUBSUB_PROVIDERS_THROW_ERRORS"
+ : "ERR_PUBSUB_DID_NOT_RECEIVE_RESPONSE_AFTER_PUBLISHING_CHALLENGE_REQUEST", {
+ challengeExchanges,
+ publishToDifferentProviderThresholdSeconds: this._publishToDifferentProviderThresholdSeconds,
pubsubTopic: this._communityPubsubTopicWithFallback(),
providerHeliaContexts: this._libp2pJsClientHeliaContexts()
});
diff --git a/dist/browser/runtime/browser/libp2p-extra-transports.js b/dist/browser/runtime/browser/libp2p-extra-transports.js
index 1b7028978d1da8c3f78e9b4d18e790a3ad025e25..2b8eff3ce509cff57ac5be3d31b26b38a5301a52 100644
--- a/dist/browser/runtime/browser/libp2p-extra-transports.js
+++ b/dist/browser/runtime/browser/libp2p-extra-transports.js
@@ -1,3 +1,4 @@
-const extraLibp2pTransports = [];
+import { webTransport } from "@libp2p/webtransport";
+const extraLibp2pTransports = typeof globalThis.WebTransport === "function" ? [webTransport()] : [];
export default extraLibp2pTransports;
//# sourceMappingURL=libp2p-extra-transports.js.map
diff --git a/package.json b/package.json
index 7667db9846b0e18a55ce3942d243f2148b2ab5a0..f064d57f444083a6cf2c7a9ecb1b8ab1049e7a46 100644
--- a/package.json
+++ b/package.json
@@ -78,6 +78,7 @@
"@libp2p/identify": "4.1.7",
"@libp2p/interface": "3.2.3",
"@libp2p/peer-id": "6.0.10",
+ "@libp2p/webtransport": "6.0.0",
"@multiformats/multiaddr": "13.0.3",
"@noble/curves": "2.2.0",
"@pkcprotocol/pkc-logger": "0.1.0",
+1 -1
View File
@@ -5,6 +5,6 @@ packageExtensions:
peerDependencies:
"@types/react": ">=18.0.0"
react: ">=17.0.1"
"@pkcprotocol/pkc-js@0.0.47":
"@pkcprotocol/pkc-js@0.0.48":
dependencies:
"@libp2p/webtransport": "6.0.0"
+3 -3
View File
@@ -9,7 +9,7 @@
"private": true,
"dependencies": {
"@bbob/parser": "4.3.1",
"@bitsocial/bitsocial-react-hooks": "0.1.17",
"@bitsocial/bitsocial-react-hooks": "0.1.19",
"@bitsocial/bso-resolver": "0.0.8",
"@capacitor/app": "7.0.1",
"@capacitor/browser": "7.0.5",
@@ -17,7 +17,7 @@
"@capawesome/capacitor-android-edge-to-edge-support": "7.2.2",
"@chenglou/pretext": "0.0.5",
"@floating-ui/react": "0.26.1",
"@pkcprotocol/pkc-js": "patch:@pkcprotocol/pkc-js@npm%3A0.0.47#~/.yarn/patches/@pkcprotocol-pkc-js-npm-0.0.47-e2131d72c8.patch",
"@pkcprotocol/pkc-js": "patch:@pkcprotocol/pkc-js@npm%3A0.0.48#~/.yarn/patches/@pkcprotocol-pkc-js-npm-0.0.48-7f3bbd0d02.patch",
"@react-spring/web": "10.0.3",
"@ruffle-rs/ruffle": "0.2.0",
"@types/node": "20.19.37",
@@ -244,7 +244,7 @@
"yaml@npm:^2.8.2": "2.8.3",
"use-sync-external-store": "1.6.0",
"@electron/notarize@npm:^2.1.0": "patch:@electron/notarize@npm%3A2.5.0#~/.yarn/patches/@electron-notarize-npm-2.5.0-b15dc30c99.patch",
"@pkcprotocol/pkc-js@npm:0.0.47": "patch:@pkcprotocol/pkc-js@npm%3A0.0.47#~/.yarn/patches/@pkcprotocol-pkc-js-npm-0.0.47-e2131d72c8.patch"
"@pkcprotocol/pkc-js@npm:0.0.48": "patch:@pkcprotocol/pkc-js@npm%3A0.0.48#~/.yarn/patches/@pkcprotocol-pkc-js-npm-0.0.48-7f3bbd0d02.patch"
},
"main": "electron/main.js",
"lint-staged": {
@@ -61,6 +61,46 @@ describe('getRawBoardThreadState', () => {
).toBe(true);
});
it('treats explicit empty page CIDs as a fully loaded empty board', () => {
const community = {
posts: {
pageCids: {},
pages: {},
},
updatedAt: 1781773422,
} as Community;
expect(
getRawBoardThreadState({
accountId: undefined,
communitiesPages: {} as CommunitiesPages,
community,
sortType: 'active',
}),
).toMatchObject({
isFullyLoaded: true,
rootThreadCids: new Set<string>(),
});
});
it('does not treat placeholder empty page CIDs as fully loaded', () => {
const community = {
posts: {
pageCids: {},
pages: {},
},
} as Community;
expect(
getRawBoardThreadState({
accountId: undefined,
communitiesPages: {} as CommunitiesPages,
community,
sortType: 'active',
}).isFullyLoaded,
).toBe(false);
});
it('walks stored board pages without importing side-effectful stores', () => {
const community = {
posts: {
+7 -1
View File
@@ -1,11 +1,13 @@
import type { Comment, CommunitiesPages, Community, CommunityPage } from '@bitsocial/bitsocial-react-hooks';
export type RawBoardThreadState = {
hasExplicitEmptyPageCids: boolean;
isFullyLoaded: boolean;
rootThreadCids: Set<string>;
};
const EMPTY_RAW_BOARD_THREAD_STATE: RawBoardThreadState = {
hasExplicitEmptyPageCids: false,
isFullyLoaded: false,
rootThreadCids: new Set<string>(),
};
@@ -80,6 +82,7 @@ export const getRawBoardThreadState = ({
if (pages.length > 0) {
return {
hasExplicitEmptyPageCids: false,
isFullyLoaded: !pages[pages.length - 1]?.nextCid,
rootThreadCids,
};
@@ -88,6 +91,8 @@ export const getRawBoardThreadState = ({
const hasPageCid = Boolean(community.posts?.pageCids?.[sortType]);
const preloadedPages = (preloadedSortPage ? [preloadedSortPage] : []) as Array<{ comments?: Comment[]; nextCid?: string }>;
const hasCompletePreloadedPage = !hasPageCid && preloadedPages.some((page) => Array.isArray(page?.comments)) && preloadedPages.every((page) => !page?.nextCid);
const hasFetchedCommunityUpdate = typeof community.updatedAt === 'number' || typeof community.updateCid === 'string';
const hasExplicitEmptyPageCids = hasFetchedCommunityUpdate && Boolean(community.posts?.pageCids && !hasPageCid);
if (hasCompletePreloadedPage) {
for (const page of preloadedPages) {
@@ -96,7 +101,8 @@ export const getRawBoardThreadState = ({
}
return {
isFullyLoaded: hasCompletePreloadedPage,
hasExplicitEmptyPageCids,
isFullyLoaded: hasCompletePreloadedPage || hasExplicitEmptyPageCids,
rootThreadCids,
};
};
+103
View File
@@ -36,6 +36,7 @@ type TestComment = {
type TestCommunity = {
error?: Error;
nameResolved?: boolean;
updatedAt?: number;
posts?: {
pageCids?: Record<string, string>;
pages?: Record<string, { comments?: TestComment[]; nextCid?: string }>;
@@ -687,6 +688,43 @@ describe('Board', () => {
expect(container.querySelectorAll('[data-testid="loading-ellipsis"]').length).toBe(1);
});
it('renders an empty flash table when a loaded board reports explicit empty page cids', async () => {
testState.directories = [{ address: 'flash-posting.bso', directoryCode: 'f', title: '/f/ - Flash' }];
testState.directoryByAddress = {
'flash-posting.bso': {
address: 'flash-posting.bso',
directoryCode: 'f',
features: { postsPerPage: 50 },
title: '/f/ - Flash',
},
};
testState.resolvedCommunityAddress = 'flash-posting.bso';
testState.feedState = 'fetching-ipns';
testState.hasMore = true;
testState.community = {
error: undefined,
posts: {
pageCids: {},
pages: {},
},
shortAddress: 'flash-posting.bso',
state: 'succeeded',
title: '/f/ - Flash',
updatedAt: 1781773422,
};
testState.communitySnapshot = {
shortAddress: 'flash-posting.bso',
title: '/f/ - Flash',
};
await renderBoard({ initialEntry: '/f', routePath: '/:boardIdentifier/*' });
const table = container.querySelector('#flash-list');
expect(table).toBeTruthy();
expect(table?.textContent).toContain('no posts');
expect(table?.querySelector('[data-testid="loading-ellipsis"]')).toBeNull();
});
it('inserts a nonoko pending account comment after pinned posts on the redirected board index', async () => {
const currentTimestamp = Math.floor(Date.now() / 1000);
testState.feed = [
@@ -1043,6 +1081,71 @@ describe('Board', () => {
expect(container.querySelector('[data-testid="loading-ellipsis"]')).toBeNull();
});
it('keeps loading when an empty preloaded board page finishes before the feed', async () => {
testState.feedStateString = undefined;
testState.feedState = 'fetching-ipns';
testState.hasMore = true;
testState.community = {
error: undefined,
shortAddress: 'music-posting.eth',
state: 'succeeded',
title: '/mu/ - Music',
};
markRawBoardThreadsFullyLoaded();
await renderBoard({ initialEntry: '/mu', routePath: '/:boardIdentifier/*' });
expect(container.textContent).not.toContain('no_threads');
expect(container.querySelector('[data-testid="loading-ellipsis"]')?.textContent).toBe('downloading_board');
expect(container.textContent).toContain('load_more');
});
it('shows no threads when a loaded board reports explicit empty page cids', async () => {
testState.feedStateString = 'Downloading board from peers';
testState.feedState = 'fetching-ipns';
testState.hasMore = true;
testState.community = {
error: undefined,
posts: {
pageCids: {},
pages: {},
},
shortAddress: 'blog.bitsocial.bso',
state: 'succeeded',
title: 'Bitsocial Updates',
updatedAt: 1781773422,
};
testState.communitySnapshot = {
shortAddress: 'blog.bitsocial.bso',
title: 'Bitsocial Updates',
};
await renderBoard({ initialEntry: '/blog.bitsocial.bso', routePath: '/:boardIdentifier/*' });
expect(container.textContent).toContain('no_threads');
expect(container.querySelector('[data-testid="loading-ellipsis"]')).toBeNull();
expect(container.textContent).not.toContain('load_more');
});
it('keeps loading when raw board pages contain threads but the feed has not caught up', async () => {
testState.feedStateString = undefined;
testState.feedState = 'fetching-ipns';
testState.hasMore = true;
testState.community = {
error: undefined,
shortAddress: 'music-posting.eth',
state: 'succeeded',
title: '/mu/ - Music',
};
markRawBoardThreadsFullyLoaded([{ cid: 'post-1' }]);
await renderBoard({ initialEntry: '/mu', routePath: '/:boardIdentifier/*' });
expect(container.textContent).not.toContain('no_threads');
expect(container.querySelector('[data-testid="loading-ellipsis"]')?.textContent).toBe('downloading_board');
expect(container.textContent).toContain('load_more');
});
it('does not show no threads after board metadata loads but raw thread pages are still missing', async () => {
testState.feedStateString = undefined;
testState.feedState = 'succeeded';
+22 -9
View File
@@ -60,6 +60,7 @@ interface BoardFooterProps {
combinedFeedLength: number;
isSingleCommunityBoard: boolean;
isRawBoardThreadStateFullyLoaded: boolean;
isKnownEmptySingleCommunityBoard: boolean;
isInSubscriptionsView: boolean;
isInModView: boolean;
currentTimeFilterName: string;
@@ -84,6 +85,7 @@ const BoardFooter = ({
combinedFeedLength,
isSingleCommunityBoard,
isRawBoardThreadStateFullyLoaded,
isKnownEmptySingleCommunityBoard,
isInSubscriptionsView,
isInModView,
currentTimeFilterName,
@@ -102,7 +104,9 @@ const BoardFooter = ({
const isLoadedCommunityState = communityState === 'succeeded' || communityState === 'ready';
const isFeedSucceeded = feedState === 'succeeded';
const isFeedFailed = feedState === 'failed';
const canShowNoThreads = isSingleCommunityBoard ? isLoadedCommunityState && isFeedSucceeded && isRawBoardThreadStateFullyLoaded : isFeedSucceeded && !hasMore;
const canShowNoThreads =
isKnownEmptySingleCommunityBoard ||
(isSingleCommunityBoard ? isLoadedCommunityState && isFeedSucceeded && isRawBoardThreadStateFullyLoaded : isFeedSucceeded && !hasMore);
const isEmptyFeedLoading = combinedFeedLength === 0 && !canShowNoThreads && (isSingleCommunityBoard ? communityState !== 'failed' : !isFeedFailed);
const showFooterLoading = showLoadingEllipsis && (hasMore || isEmptyFeedLoading);
@@ -472,6 +476,14 @@ const Board = ({ feedCacheKey, viewType, boardIdentifier: boardIdentifierProp, t
[account?.id, communitiesPages, communityData, isMultiboardView],
);
const isRawBoardThreadStateFullyLoaded = rawBoardThreadState?.isFullyLoaded ?? false;
const hasExplicitEmptyPageCids = rawBoardThreadState?.hasExplicitEmptyPageCids ?? false;
const isRawBoardThreadStateEmpty = isRawBoardThreadStateFullyLoaded && (rawBoardThreadState?.rootThreadCids.size ?? 0) === 0;
const isSingleCommunityBoard = !isInAllView && !isInSubscriptionsView && !isInModView;
const isLoadedCommunityState = communityState === 'succeeded' || communityState === 'ready';
const isFeedSucceeded = feedState === 'succeeded';
const isKnownEmptySingleCommunityBoard =
isSingleCommunityBoard && combinedFeed.length === 0 && isLoadedCommunityState && isRawBoardThreadStateEmpty && (hasExplicitEmptyPageCids || isFeedSucceeded);
const effectiveHasMore = isKnownEmptySingleCommunityBoard ? false : hasMore;
const title = isInAllView ? t('all') : isInSubscriptionsView ? t('subscriptions') : isInModView ? t('mod') : communityTitle;
// Memoize footer component to preserve identity across renders (Virtuoso optimization)
@@ -483,11 +495,12 @@ const Board = ({ feedCacheKey, viewType, boardIdentifier: boardIdentifierProp, t
{shouldUseFlashTable ? null : (
<BoardFooter
communityAddresses={communityAddresses}
hasMore={hasMore}
hasMore={effectiveHasMore}
feedState={feedState}
combinedFeedLength={combinedFeed.length}
isSingleCommunityBoard={!isInAllView && !isInSubscriptionsView && !isInModView}
isSingleCommunityBoard={isSingleCommunityBoard}
isRawBoardThreadStateFullyLoaded={isRawBoardThreadStateFullyLoaded}
isKnownEmptySingleCommunityBoard={isKnownEmptySingleCommunityBoard}
isInSubscriptionsView={isInSubscriptionsView}
isInModView={isInModView}
currentTimeFilterName={currentTimeFilterName}
@@ -552,7 +565,7 @@ const Board = ({ feedCacheKey, viewType, boardIdentifier: boardIdentifierProp, t
</div>
</>
)}
{hasMore && !effectiveInfiniteScroll && !shouldUseFlashTable && (
{effectiveHasMore && !effectiveInfiniteScroll && !shouldUseFlashTable && (
<div className={mobileFooterStyles.mobileFooterButtons}>
<button type='button' className='button' onClick={() => setEnableInfiniteScroll(true)}>
{t('load_more')}
@@ -566,9 +579,11 @@ const Board = ({ feedCacheKey, viewType, boardIdentifier: boardIdentifierProp, t
}),
[
communityAddresses,
hasMore,
effectiveHasMore,
combinedFeed.length,
isRawBoardThreadStateFullyLoaded,
isKnownEmptySingleCommunityBoard,
isSingleCommunityBoard,
isInAllView,
isInSubscriptionsView,
isInModView,
@@ -665,9 +680,7 @@ const Board = ({ feedCacheKey, viewType, boardIdentifier: boardIdentifierProp, t
communityIdentifier.publicKey.length > 0 &&
communityData?.nameResolved === false;
const displayFeed = effectiveInfiniteScroll ? combinedFeed : currentPageFeed;
const isLoadedCommunityState = communityState === 'succeeded' || communityState === 'ready';
const isFeedSucceeded = feedState === 'succeeded';
const canShowEmptyFlashTable = isLoadedCommunityState && isFeedSucceeded && isRawBoardThreadStateFullyLoaded;
const canShowEmptyFlashTable = hasExplicitEmptyPageCids || (isLoadedCommunityState && isFeedSucceeded && isRawBoardThreadStateFullyLoaded);
const shouldShowFlashTableLoading = shouldUseFlashTable && displayFeed.length === 0 && !canShowEmptyFlashTable && communityState !== 'failed' && feedState !== 'failed';
return (
@@ -697,7 +710,7 @@ const Board = ({ feedCacheKey, viewType, boardIdentifier: boardIdentifierProp, t
itemContent={boardItemContent}
useWindowScroll={true}
components={footerComponents}
endReached={hasMore ? loadMore : undefined}
endReached={effectiveHasMore ? loadMore : undefined}
ref={virtuosoRef}
restoreStateFrom={lastVirtuosoState}
initialScrollTop={lastVirtuosoState?.scrollTop}
+478 -137
View File
@@ -10,7 +10,7 @@ __metadata:
resolution: "5chan@workspace:."
dependencies:
"@bbob/parser": "npm:4.3.1"
"@bitsocial/bitsocial-react-hooks": "npm:0.1.17"
"@bitsocial/bitsocial-react-hooks": "npm:0.1.19"
"@bitsocial/bso-resolver": "npm:0.0.8"
"@capacitor/android": "npm:7.4.5"
"@capacitor/app": "npm:7.0.1"
@@ -26,7 +26,7 @@ __metadata:
"@electron-forge/maker-zip": "npm:7.8.0"
"@electron/rebuild": "npm:3.7.2"
"@floating-ui/react": "npm:0.26.1"
"@pkcprotocol/pkc-js": "patch:@pkcprotocol/pkc-js@npm%3A0.0.47#~/.yarn/patches/@pkcprotocol-pkc-js-npm-0.0.47-e2131d72c8.patch"
"@pkcprotocol/pkc-js": "patch:@pkcprotocol/pkc-js@npm%3A0.0.48#~/.yarn/patches/@pkcprotocol-pkc-js-npm-0.0.48-7f3bbd0d02.patch"
"@react-spring/web": "npm:10.0.3"
"@reforged/maker-appimage": "npm:5.1.1"
"@ruffle-rs/ruffle": "npm:0.2.0"
@@ -1580,12 +1580,12 @@ __metadata:
languageName: node
linkType: hard
"@bitsocial/bitsocial-react-hooks@npm:0.1.17":
version: 0.1.17
resolution: "@bitsocial/bitsocial-react-hooks@npm:0.1.17"
"@bitsocial/bitsocial-react-hooks@npm:0.1.19":
version: 0.1.19
resolution: "@bitsocial/bitsocial-react-hooks@npm:0.1.19"
dependencies:
"@bitsocial/bso-resolver": "npm:0.0.8"
"@pkcprotocol/pkc-js": "npm:0.0.47"
"@pkcprotocol/pkc-js": "npm:0.0.48"
"@pkcprotocol/pkc-logger": "npm:0.1.0"
assert: "npm:2.0.0"
ethers: "npm:5.8.0"
@@ -1601,7 +1601,7 @@ __metadata:
zustand: "npm:4.0.0"
peerDependencies:
react: ">=16.8"
checksum: 10c0/3b652a2b6171b70c0e2047a32088cebf05f99b87c008d87218f144d766e076c47c564f5f70ff160e55d7aae83f94a367998e511e05b716523e71a0ada52fe6a2
checksum: 10c0/5645249211c4b0d91b0e9f6c91b75703da15ff5dbf37bc2eab2353959818bb0d2803ee649fae30530a42298ec55c34e2f3900c71025c89af35a0314d622f42a3
languageName: node
linkType: hard
@@ -3194,7 +3194,26 @@ __metadata:
languageName: node
linkType: hard
"@helia/delegated-routing-v1-http-api-client@npm:6.0.1, @helia/delegated-routing-v1-http-api-client@npm:^6.0.1":
"@helia/delegated-routing-v1-http-api-client@npm:8.0.1":
version: 8.0.1
resolution: "@helia/delegated-routing-v1-http-api-client@npm:8.0.1"
dependencies:
"@libp2p/interface": "npm:^3.2.2"
"@libp2p/peer-id": "npm:^6.0.9"
"@libp2p/utils": "npm:^7.2.2"
"@multiformats/multiaddr": "npm:^13.0.3"
any-signal: "npm:^4.2.0"
browser-readablestream-to-it: "npm:^2.0.12"
it-first: "npm:^3.0.11"
it-map: "npm:^3.1.6"
it-ndjson: "npm:^2.0.0"
multiformats: "npm:^14.0.0"
uint8arrays: "npm:^6.1.1"
checksum: 10c0/2bf0042fb53032f82eff85a816e01b5541ed3dbf15729b9e13e1bc60e9f17d85daf6198f324f7c45f44ec873a131d5a5f405c13e2c710bf41ccfd264de1868be
languageName: node
linkType: hard
"@helia/delegated-routing-v1-http-api-client@npm:^6.0.1":
version: 6.0.1
resolution: "@helia/delegated-routing-v1-http-api-client@npm:6.0.1"
dependencies:
@@ -3680,6 +3699,16 @@ __metadata:
languageName: node
linkType: hard
"@ipld/dag-cbor@npm:^10.0.1":
version: 10.0.1
resolution: "@ipld/dag-cbor@npm:10.0.1"
dependencies:
cborg: "npm:^5.0.1"
multiformats: "npm:^14.0.0"
checksum: 10c0/f9b51461c06c6ac2c2584dfd990dfd9ff2648b93c9a9fd5b2a34ffd8f3ceb4f22f313209a3ca4fabc0c46c9be60c5daa119d77511623685099f00ebb018871ce
languageName: node
linkType: hard
"@ipld/dag-cbor@npm:^9.0.0, @ipld/dag-cbor@npm:^9.2.4":
version: 9.2.5
resolution: "@ipld/dag-cbor@npm:9.2.5"
@@ -3700,7 +3729,7 @@ __metadata:
languageName: node
linkType: hard
"@ipld/dag-json@npm:^10.0.0, @ipld/dag-json@npm:^10.2.5":
"@ipld/dag-json@npm:^10.2.5":
version: 10.2.6
resolution: "@ipld/dag-json@npm:10.2.6"
dependencies:
@@ -3720,6 +3749,16 @@ __metadata:
languageName: node
linkType: hard
"@ipld/dag-json@npm:^11.0.0":
version: 11.0.0
resolution: "@ipld/dag-json@npm:11.0.0"
dependencies:
cborg: "npm:^5.0.0"
multiformats: "npm:^14.0.0"
checksum: 10c0/9405f318dc7fd9467b20e68a292651965308e5b42f1a231cb2a26acac0fde87e39a5b5da947fec4623296cfc703b2af5c338c3663e6f54ad4e50fb5299ed92b5
languageName: node
linkType: hard
"@ipld/dag-pb@npm:^4.0.0, @ipld/dag-pb@npm:^4.1.5":
version: 4.1.5
resolution: "@ipld/dag-pb@npm:4.1.5"
@@ -3729,6 +3768,15 @@ __metadata:
languageName: node
linkType: hard
"@ipld/dag-pb@npm:^4.1.7":
version: 4.1.7
resolution: "@ipld/dag-pb@npm:4.1.7"
dependencies:
multiformats: "npm:^14.0.0"
checksum: 10c0/93c68778c05749f021393c2a98f7966700ab921216ca632c7dded7ae8191e98770dafe15623755d4ea04c690d73d3980ef3b2ca08448fb7950353d071bdad133
languageName: node
linkType: hard
"@ipshipyard/libp2p-auto-tls@npm:^2.0.1":
version: 2.0.1
resolution: "@ipshipyard/libp2p-auto-tls@npm:2.0.1"
@@ -3916,18 +3964,18 @@ __metadata:
languageName: node
linkType: hard
"@libp2p/crypto@npm:5.1.17, @libp2p/crypto@npm:^5.1.15, @libp2p/crypto@npm:^5.1.17":
version: 5.1.17
resolution: "@libp2p/crypto@npm:5.1.17"
"@libp2p/crypto@npm:5.1.19":
version: 5.1.19
resolution: "@libp2p/crypto@npm:5.1.19"
dependencies:
"@libp2p/interface": "npm:^3.2.2"
"@libp2p/interface": "npm:^3.2.3"
"@noble/curves": "npm:^2.0.1"
"@noble/hashes": "npm:^2.0.1"
multiformats: "npm:^13.4.0"
multiformats: "npm:^14.0.0"
protons-runtime: "npm:^6.0.1"
uint8arraylist: "npm:^2.4.8"
uint8arrays: "npm:^5.1.0"
checksum: 10c0/fa63aa9a7260f9841d477daee82677d3cd0a6f287ac77bacb1131998764ac76f819b7b453985579ef1f9c14115f435ceb23f316388491650a54c00c52a1c143b
uint8arrays: "npm:^6.1.1"
checksum: 10c0/bac81169a941cce3eb047cdc15d2510ebcce1524788b2caa580e3b002bd5ef61478144c90c728a14fc7126626995caa7655e65d1ee0d89d0168379ab1d103da0
languageName: node
linkType: hard
@@ -3946,7 +3994,7 @@ __metadata:
languageName: node
linkType: hard
"@libp2p/crypto@npm:^5.1.10, @libp2p/crypto@npm:^5.1.20":
"@libp2p/crypto@npm:^5.1.10, @libp2p/crypto@npm:^5.1.19, @libp2p/crypto@npm:^5.1.20":
version: 5.1.20
resolution: "@libp2p/crypto@npm:5.1.20"
dependencies:
@@ -3961,6 +4009,21 @@ __metadata:
languageName: node
linkType: hard
"@libp2p/crypto@npm:^5.1.15, @libp2p/crypto@npm:^5.1.17":
version: 5.1.17
resolution: "@libp2p/crypto@npm:5.1.17"
dependencies:
"@libp2p/interface": "npm:^3.2.2"
"@noble/curves": "npm:^2.0.1"
"@noble/hashes": "npm:^2.0.1"
multiformats: "npm:^13.4.0"
protons-runtime: "npm:^6.0.1"
uint8arraylist: "npm:^2.4.8"
uint8arrays: "npm:^5.1.0"
checksum: 10c0/fa63aa9a7260f9841d477daee82677d3cd0a6f287ac77bacb1131998764ac76f819b7b453985579ef1f9c14115f435ceb23f316388491650a54c00c52a1c143b
languageName: node
linkType: hard
"@libp2p/crypto@npm:^5.1.18":
version: 5.1.18
resolution: "@libp2p/crypto@npm:5.1.18"
@@ -3992,7 +4055,22 @@ __metadata:
languageName: node
linkType: hard
"@libp2p/fetch@npm:4.1.3, @libp2p/fetch@npm:^4.1.0":
"@libp2p/fetch@npm:4.1.6":
version: 4.1.6
resolution: "@libp2p/fetch@npm:4.1.6"
dependencies:
"@libp2p/interface": "npm:^3.2.3"
"@libp2p/interface-internal": "npm:^3.1.6"
"@libp2p/utils": "npm:^7.2.2"
main-event: "npm:^1.0.1"
protons-runtime: "npm:^6.0.1"
uint8arraylist: "npm:^2.4.8"
uint8arrays: "npm:^6.1.1"
checksum: 10c0/d4b70d3f74d68c49a32c329dffbf3446c0477dceb18bf6203eaed279d77e5f2707d2174146a127d3d8ce09aec03109be6efd034883e008a1da4cf88f7e511967
languageName: node
linkType: hard
"@libp2p/fetch@npm:^4.1.0":
version: 4.1.3
resolution: "@libp2p/fetch@npm:4.1.3"
dependencies:
@@ -4127,7 +4205,29 @@ __metadata:
languageName: node
linkType: hard
"@libp2p/identify@npm:4.1.3, @libp2p/identify@npm:^4.1.0":
"@libp2p/identify@npm:4.1.7":
version: 4.1.7
resolution: "@libp2p/identify@npm:4.1.7"
dependencies:
"@libp2p/crypto": "npm:^5.1.19"
"@libp2p/interface": "npm:^3.2.3"
"@libp2p/interface-internal": "npm:^3.1.6"
"@libp2p/peer-id": "npm:^6.0.10"
"@libp2p/peer-record": "npm:^9.0.11"
"@libp2p/utils": "npm:^7.2.2"
"@multiformats/multiaddr": "npm:^13.0.3"
"@multiformats/multiaddr-matcher": "npm:^3.0.2"
it-drain: "npm:^3.0.10"
it-parallel: "npm:^3.0.13"
main-event: "npm:^1.0.1"
protons-runtime: "npm:^6.0.1"
uint8arraylist: "npm:^2.4.8"
uint8arrays: "npm:^6.1.1"
checksum: 10c0/320854874e06adae7ea26f253e75732560cf4697ae2d158f33019f44b3bdc2da75f067dbd045f7340565ba8287ddfe7bbd33f161dc918c4d0684a78502260bf1
languageName: node
linkType: hard
"@libp2p/identify@npm:^4.1.0":
version: 4.1.3
resolution: "@libp2p/identify@npm:4.1.3"
dependencies:
@@ -4185,17 +4285,29 @@ __metadata:
languageName: node
linkType: hard
"@libp2p/interface@npm:3.2.2, @libp2p/interface@npm:^3.2.0, @libp2p/interface@npm:^3.2.2":
version: 3.2.2
resolution: "@libp2p/interface@npm:3.2.2"
"@libp2p/interface-internal@npm:^3.1.6":
version: 3.1.7
resolution: "@libp2p/interface-internal@npm:3.1.7"
dependencies:
"@libp2p/interface": "npm:^3.2.4"
"@libp2p/peer-collections": "npm:^7.0.22"
"@multiformats/multiaddr": "npm:^13.0.3"
progress-events: "npm:^1.0.1"
checksum: 10c0/fd22459e3249cc5e84c933f16c182419abc1660c79f3eda6bf8979d806d5977bacb684f71e42630f254ceea4c6d54178e7c8eb477cfd26c8558ac9b2907ce81b
languageName: node
linkType: hard
"@libp2p/interface@npm:3.2.3":
version: 3.2.3
resolution: "@libp2p/interface@npm:3.2.3"
dependencies:
"@multiformats/dns": "npm:^1.0.6"
"@multiformats/multiaddr": "npm:^13.0.1"
"@multiformats/multiaddr": "npm:^13.0.3"
main-event: "npm:^1.0.1"
multiformats: "npm:^13.4.0"
multiformats: "npm:^14.0.0"
progress-events: "npm:^1.1.0"
uint8arraylist: "npm:^2.4.8"
checksum: 10c0/e3393a2739d5c7ff65a818adc9ab599d0c59e093a0e8024f67853b9219f365623e36b2218786c475ba53cd2d8b17bd72c6b2ec46c53d89590549bf2185d10bb5
checksum: 10c0/a38dc3acc79156a2bf0695acb4772b640a5361b6abb3266e340e1e35b0067a7168ac0d8d884506caf2f576277e081987990b1119c01990496b613aef137b0c06
languageName: node
linkType: hard
@@ -4213,7 +4325,21 @@ __metadata:
languageName: node
linkType: hard
"@libp2p/interface@npm:^3.2.4":
"@libp2p/interface@npm:^3.2.0, @libp2p/interface@npm:^3.2.2":
version: 3.2.2
resolution: "@libp2p/interface@npm:3.2.2"
dependencies:
"@multiformats/dns": "npm:^1.0.6"
"@multiformats/multiaddr": "npm:^13.0.1"
main-event: "npm:^1.0.1"
multiformats: "npm:^13.4.0"
progress-events: "npm:^1.1.0"
uint8arraylist: "npm:^2.4.8"
checksum: 10c0/e3393a2739d5c7ff65a818adc9ab599d0c59e093a0e8024f67853b9219f365623e36b2218786c475ba53cd2d8b17bd72c6b2ec46c53d89590549bf2185d10bb5
languageName: node
linkType: hard
"@libp2p/interface@npm:^3.2.3, @libp2p/interface@npm:^3.2.4":
version: 3.2.4
resolution: "@libp2p/interface@npm:3.2.4"
dependencies:
@@ -4337,7 +4463,7 @@ __metadata:
languageName: node
linkType: hard
"@libp2p/logger@npm:^6.2.9":
"@libp2p/logger@npm:^6.2.8, @libp2p/logger@npm:^6.2.9":
version: 6.2.9
resolution: "@libp2p/logger@npm:6.2.9"
dependencies:
@@ -4394,6 +4520,19 @@ __metadata:
languageName: node
linkType: hard
"@libp2p/multistream-select@npm:^7.0.21":
version: 7.0.22
resolution: "@libp2p/multistream-select@npm:7.0.22"
dependencies:
"@libp2p/interface": "npm:^3.2.4"
"@libp2p/utils": "npm:^7.2.3"
it-length-prefixed: "npm:^11.0.1"
uint8arraylist: "npm:^3.0.2"
uint8arrays: "npm:^6.1.1"
checksum: 10c0/0711857ca406ae04594f430ff24c4dcc7774a93c9f421e729558d8f567c1ebf054c03622970b7c762df70ed450bc8bc30ae90af61593b6431e960224218cc231
languageName: node
linkType: hard
"@libp2p/noise@npm:^1.0.0":
version: 1.0.1
resolution: "@libp2p/noise@npm:1.0.1"
@@ -4451,15 +4590,27 @@ __metadata:
languageName: node
linkType: hard
"@libp2p/peer-id@npm:6.0.8, @libp2p/peer-id@npm:^6.0.6, @libp2p/peer-id@npm:^6.0.8":
version: 6.0.8
resolution: "@libp2p/peer-id@npm:6.0.8"
"@libp2p/peer-collections@npm:^7.0.21, @libp2p/peer-collections@npm:^7.0.22":
version: 7.0.22
resolution: "@libp2p/peer-collections@npm:7.0.22"
dependencies:
"@libp2p/crypto": "npm:^5.1.17"
"@libp2p/interface": "npm:^3.2.2"
multiformats: "npm:^13.4.0"
uint8arrays: "npm:^5.1.0"
checksum: 10c0/4b65dc5d9c17e4aa717582a07433524b1591bd3e67df3785e704878147508bc4fc8a5d1fc54a26e3da7fc478bdc22485a39447f8439423a927aa20302af63e6e
"@libp2p/interface": "npm:^3.2.4"
"@libp2p/peer-id": "npm:^6.0.11"
"@libp2p/utils": "npm:^7.2.3"
multiformats: "npm:^14.0.0"
checksum: 10c0/726754749d7fcbba6ab41c6e8dcd8268851fa9d2e5fead11dc1a0cb57e38b0b52e6cd80a655792e4d841069076cd059d623e0c6c36b5e8f7073cdd91faea3cbe
languageName: node
linkType: hard
"@libp2p/peer-id@npm:6.0.10":
version: 6.0.10
resolution: "@libp2p/peer-id@npm:6.0.10"
dependencies:
"@libp2p/crypto": "npm:^5.1.19"
"@libp2p/interface": "npm:^3.2.3"
multiformats: "npm:^14.0.0"
uint8arrays: "npm:^6.1.1"
checksum: 10c0/c29c93e9318a8f28c8f9a831bb91bc626e4d74c0f585506425ea6e200b42498d186c9eb1382854238fd183be01aeda05642589599fec1b7c9e21a8ecf7af5064
languageName: node
linkType: hard
@@ -4475,7 +4626,7 @@ __metadata:
languageName: node
linkType: hard
"@libp2p/peer-id@npm:^6.0.1":
"@libp2p/peer-id@npm:^6.0.1, @libp2p/peer-id@npm:^6.0.10, @libp2p/peer-id@npm:^6.0.11":
version: 6.0.11
resolution: "@libp2p/peer-id@npm:6.0.11"
dependencies:
@@ -4487,6 +4638,18 @@ __metadata:
languageName: node
linkType: hard
"@libp2p/peer-id@npm:^6.0.6, @libp2p/peer-id@npm:^6.0.8":
version: 6.0.8
resolution: "@libp2p/peer-id@npm:6.0.8"
dependencies:
"@libp2p/crypto": "npm:^5.1.17"
"@libp2p/interface": "npm:^3.2.2"
multiformats: "npm:^13.4.0"
uint8arrays: "npm:^5.1.0"
checksum: 10c0/4b65dc5d9c17e4aa717582a07433524b1591bd3e67df3785e704878147508bc4fc8a5d1fc54a26e3da7fc478bdc22485a39447f8439423a927aa20302af63e6e
languageName: node
linkType: hard
"@libp2p/peer-id@npm:^6.0.9":
version: 6.0.9
resolution: "@libp2p/peer-id@npm:6.0.9"
@@ -4499,6 +4662,23 @@ __metadata:
languageName: node
linkType: hard
"@libp2p/peer-record@npm:^9.0.11, @libp2p/peer-record@npm:^9.0.12":
version: 9.0.12
resolution: "@libp2p/peer-record@npm:9.0.12"
dependencies:
"@libp2p/crypto": "npm:^5.1.20"
"@libp2p/interface": "npm:^3.2.4"
"@libp2p/peer-id": "npm:^6.0.11"
"@multiformats/multiaddr": "npm:^13.0.3"
multiformats: "npm:^14.0.0"
protons-runtime: "npm:^7.0.0"
uint8-varint: "npm:^3.0.0"
uint8arraylist: "npm:^3.0.2"
uint8arrays: "npm:^6.1.1"
checksum: 10c0/322a552e18377e59f0f08ae64095c4f2b29fd500a01d762a69dc1b56d981363e781ff9bd48b93e3fd742fbd366d3d8a0519375579131eaf70d123bd93b28b5c6
languageName: node
linkType: hard
"@libp2p/peer-record@npm:^9.0.9":
version: 9.0.9
resolution: "@libp2p/peer-record@npm:9.0.9"
@@ -4538,6 +4718,28 @@ __metadata:
languageName: node
linkType: hard
"@libp2p/peer-store@npm:^12.0.21":
version: 12.0.22
resolution: "@libp2p/peer-store@npm:12.0.22"
dependencies:
"@libp2p/crypto": "npm:^5.1.20"
"@libp2p/interface": "npm:^3.2.4"
"@libp2p/peer-collections": "npm:^7.0.22"
"@libp2p/peer-id": "npm:^6.0.11"
"@libp2p/peer-record": "npm:^9.0.12"
"@multiformats/multiaddr": "npm:^13.0.3"
interface-datastore: "npm:^10.0.1"
it-all: "npm:^3.0.9"
main-event: "npm:^1.0.1"
mortice: "npm:^3.3.1"
multiformats: "npm:^14.0.0"
protons-runtime: "npm:^7.0.0"
uint8arraylist: "npm:^3.0.2"
uint8arrays: "npm:^6.1.1"
checksum: 10c0/d7d53adac30ef34a0952d6f641cf52db503af73dc7e89959a0d0958825e3109656eaf20d8fefdb34612d66da96699a5a610614cda47618817e1cd3c113ae9803
languageName: node
linkType: hard
"@libp2p/ping@npm:^3.1.0":
version: 3.1.3
resolution: "@libp2p/ping@npm:3.1.3"
@@ -4666,7 +4868,7 @@ __metadata:
languageName: node
linkType: hard
"@libp2p/utils@npm:^7.0.1":
"@libp2p/utils@npm:^7.0.1, @libp2p/utils@npm:^7.2.2, @libp2p/utils@npm:^7.2.3":
version: 7.2.3
resolution: "@libp2p/utils@npm:7.2.3"
dependencies:
@@ -4899,19 +5101,7 @@ __metadata:
languageName: node
linkType: hard
"@multiformats/multiaddr@npm:13.0.1, @multiformats/multiaddr@npm:^13.0.0, @multiformats/multiaddr@npm:^13.0.1":
version: 13.0.1
resolution: "@multiformats/multiaddr@npm:13.0.1"
dependencies:
"@chainsafe/is-ip": "npm:^2.0.1"
multiformats: "npm:^13.0.0"
uint8-varint: "npm:^2.0.1"
uint8arrays: "npm:^5.0.0"
checksum: 10c0/e5f360c6674cf96010fe7c6875e62c4bf35639e8a8a75e6fad9384a23f1abf35ca689b90446341ba47c242c83a9d529c25d2610bee46fe2ff68f44d19321c138
languageName: node
linkType: hard
"@multiformats/multiaddr@npm:^13.0.3":
"@multiformats/multiaddr@npm:13.0.3, @multiformats/multiaddr@npm:^13.0.3":
version: 13.0.3
resolution: "@multiformats/multiaddr@npm:13.0.3"
dependencies:
@@ -4923,6 +5113,18 @@ __metadata:
languageName: node
linkType: hard
"@multiformats/multiaddr@npm:^13.0.0, @multiformats/multiaddr@npm:^13.0.1":
version: 13.0.1
resolution: "@multiformats/multiaddr@npm:13.0.1"
dependencies:
"@chainsafe/is-ip": "npm:^2.0.1"
multiformats: "npm:^13.0.0"
uint8-varint: "npm:^2.0.1"
uint8arrays: "npm:^5.0.0"
checksum: 10c0/e5f360c6674cf96010fe7c6875e62c4bf35639e8a8a75e6fad9384a23f1abf35ca689b90446341ba47c242c83a9d529c25d2610bee46fe2ff68f44d19321c138
languageName: node
linkType: hard
"@multiformats/murmur3@npm:^2.1.8":
version: 2.2.0
resolution: "@multiformats/murmur3@npm:2.2.0"
@@ -4941,6 +5143,15 @@ __metadata:
languageName: node
linkType: hard
"@multiformats/murmur3@npm:^2.2.5":
version: 2.2.5
resolution: "@multiformats/murmur3@npm:2.2.5"
dependencies:
multiformats: "npm:^14.0.0"
checksum: 10c0/f3e081af0ba8da49f719fa5b2608e77aaedf83cd872bf1bf777d60bd96dbb49373b12538d168933f9a6ed5d67684dac1afbdbf0c4cbc1caebc03270a5fa55859
languageName: node
linkType: hard
"@multiformats/uri-to-multiaddr@npm:^10.0.0":
version: 10.0.0
resolution: "@multiformats/uri-to-multiaddr@npm:10.0.0"
@@ -6205,28 +6416,28 @@ __metadata:
languageName: node
linkType: hard
"@pkcprotocol/pkc-js@npm:0.0.47":
version: 0.0.47
resolution: "@pkcprotocol/pkc-js@npm:0.0.47"
"@pkcprotocol/pkc-js@npm:0.0.48":
version: 0.0.48
resolution: "@pkcprotocol/pkc-js@npm:0.0.48"
dependencies:
"@enhances/with-resolvers": "npm:0.0.5"
"@helia/block-brokers": "npm:5.2.4"
"@helia/delegated-routing-v1-http-api-client": "npm:6.0.1"
"@helia/delegated-routing-v1-http-api-client": "npm:8.0.1"
"@helia/ipns": "npm:9.2.1"
"@helia/unixfs": "npm:7.2.1"
"@libp2p/crypto": "npm:5.1.17"
"@libp2p/fetch": "npm:4.1.3"
"@libp2p/gossipsub": "npm:15.0.21"
"@libp2p/identify": "npm:4.1.3"
"@libp2p/interface": "npm:3.2.2"
"@libp2p/peer-id": "npm:6.0.8"
"@multiformats/multiaddr": "npm:13.0.1"
"@libp2p/crypto": "npm:5.1.19"
"@libp2p/fetch": "npm:4.1.6"
"@libp2p/gossipsub": "npm:16.0.2"
"@libp2p/identify": "npm:4.1.7"
"@libp2p/interface": "npm:3.2.3"
"@libp2p/peer-id": "npm:6.0.10"
"@multiformats/multiaddr": "npm:13.0.3"
"@noble/curves": "npm:2.2.0"
"@pkcprotocol/pkc-logger": "npm:0.1.0"
"@pkcprotocol/proper-lock-file": "npm:4.2.1"
assert: "npm:2.1.0"
better-sqlite3: "npm:12.9.0"
blockstore-core: "npm:6.1.2"
blockstore-core: "npm:7.0.1"
buffer: "npm:6.0.3"
cbor: "npm:10.0.11"
cborg: "npm:4.5.8"
@@ -6234,19 +6445,19 @@ __metadata:
ext-name: "npm:5.0.0"
helia: "npm:6.1.4"
hpagent: "npm:1.2.0"
ipfs-unixfs-importer: "npm:16.1.4"
ipns: "npm:10.1.3"
ipfs-unixfs-importer: "npm:17.0.1"
ipns: "npm:11.0.0"
it-all: "npm:3.0.6"
it-last: "npm:3.0.11"
js-sha256: "npm:0.11.1"
js-sha512: "npm:0.9.0"
kubo-rpc-client: "npm:6.1.0"
libp2p: "npm:3.2.3"
kubo-rpc-client: "npm:7.1.0"
libp2p: "npm:3.3.3"
limiter-es6-compat: "npm:2.1.2"
localforage: "npm:1.10.0"
lodash.merge: "npm:4.6.2"
lru-cache: "npm:10.1.0"
multiformats: "npm:13.4.2"
multiformats: "npm:14.0.0"
node-forge: "npm:1.4.0"
open-graph-scraper: "npm:6.11.0"
p-limit: "npm:7.3.0"
@@ -6262,37 +6473,37 @@ __metadata:
tinycache: "npm:1.1.2"
ts-custom-error: "npm:3.3.1"
typestub-ipfs-only-hash: "npm:4.0.0"
uint8arrays: "npm:5.1.0"
uint8arrays: "npm:6.1.1"
undici: "npm:7.24.7"
uuid: "npm:13.0.0"
ws: "npm:8.20.0"
zod: "npm:4.3.6"
checksum: 10c0/41013c495b3480ff664511798e045d59f729e6a341e7ea268acd819975c0e038252ab27af85108c568e9cb6a6e54c696abf663b2e91210a136c52a0f97af86cd
checksum: 10c0/eaf9c5e2a83cc6cc108bbb239f6f0461a63830ddb003ebce6aea5423478a24fbc3de9cc1560e97969af41cedcfa05167f04ccae19bd379629e2dfc1b9c5f0836
languageName: node
linkType: hard
"@pkcprotocol/pkc-js@patch:@pkcprotocol/pkc-js@npm%3A0.0.47#~/.yarn/patches/@pkcprotocol-pkc-js-npm-0.0.47-e2131d72c8.patch":
version: 0.0.47
resolution: "@pkcprotocol/pkc-js@patch:@pkcprotocol/pkc-js@npm%3A0.0.47#~/.yarn/patches/@pkcprotocol-pkc-js-npm-0.0.47-e2131d72c8.patch::version=0.0.47&hash=bbfad6"
"@pkcprotocol/pkc-js@patch:@pkcprotocol/pkc-js@npm%3A0.0.48#~/.yarn/patches/@pkcprotocol-pkc-js-npm-0.0.48-7f3bbd0d02.patch":
version: 0.0.48
resolution: "@pkcprotocol/pkc-js@patch:@pkcprotocol/pkc-js@npm%3A0.0.48#~/.yarn/patches/@pkcprotocol-pkc-js-npm-0.0.48-7f3bbd0d02.patch::version=0.0.48&hash=d06909"
dependencies:
"@enhances/with-resolvers": "npm:0.0.5"
"@helia/block-brokers": "npm:5.2.4"
"@helia/delegated-routing-v1-http-api-client": "npm:6.0.1"
"@helia/delegated-routing-v1-http-api-client": "npm:8.0.1"
"@helia/ipns": "npm:9.2.1"
"@helia/unixfs": "npm:7.2.1"
"@libp2p/crypto": "npm:5.1.17"
"@libp2p/fetch": "npm:4.1.3"
"@libp2p/gossipsub": "npm:15.0.21"
"@libp2p/identify": "npm:4.1.3"
"@libp2p/interface": "npm:3.2.2"
"@libp2p/peer-id": "npm:6.0.8"
"@multiformats/multiaddr": "npm:13.0.1"
"@libp2p/crypto": "npm:5.1.19"
"@libp2p/fetch": "npm:4.1.6"
"@libp2p/gossipsub": "npm:16.0.2"
"@libp2p/identify": "npm:4.1.7"
"@libp2p/interface": "npm:3.2.3"
"@libp2p/peer-id": "npm:6.0.10"
"@multiformats/multiaddr": "npm:13.0.3"
"@noble/curves": "npm:2.2.0"
"@pkcprotocol/pkc-logger": "npm:0.1.0"
"@pkcprotocol/proper-lock-file": "npm:4.2.1"
assert: "npm:2.1.0"
better-sqlite3: "npm:12.9.0"
blockstore-core: "npm:6.1.2"
blockstore-core: "npm:7.0.1"
buffer: "npm:6.0.3"
cbor: "npm:10.0.11"
cborg: "npm:4.5.8"
@@ -6300,19 +6511,19 @@ __metadata:
ext-name: "npm:5.0.0"
helia: "npm:6.1.4"
hpagent: "npm:1.2.0"
ipfs-unixfs-importer: "npm:16.1.4"
ipns: "npm:10.1.3"
ipfs-unixfs-importer: "npm:17.0.1"
ipns: "npm:11.0.0"
it-all: "npm:3.0.6"
it-last: "npm:3.0.11"
js-sha256: "npm:0.11.1"
js-sha512: "npm:0.9.0"
kubo-rpc-client: "npm:6.1.0"
libp2p: "npm:3.2.3"
kubo-rpc-client: "npm:7.1.0"
libp2p: "npm:3.3.3"
limiter-es6-compat: "npm:2.1.2"
localforage: "npm:1.10.0"
lodash.merge: "npm:4.6.2"
lru-cache: "npm:10.1.0"
multiformats: "npm:13.4.2"
multiformats: "npm:14.0.0"
node-forge: "npm:1.4.0"
open-graph-scraper: "npm:6.11.0"
p-limit: "npm:7.3.0"
@@ -6328,12 +6539,12 @@ __metadata:
tinycache: "npm:1.1.2"
ts-custom-error: "npm:3.3.1"
typestub-ipfs-only-hash: "npm:4.0.0"
uint8arrays: "npm:5.1.0"
uint8arrays: "npm:6.1.1"
undici: "npm:7.24.7"
uuid: "npm:13.0.0"
ws: "npm:8.20.0"
zod: "npm:4.3.6"
checksum: 10c0/461adae6d52600e9ab77b4733026d9addb9d24dc9a1dbd4744eac797eb265d6aee62d05251fe56e7c5dde12bc3d9717c0ad598d439a396675f1d3496cd31dc96
checksum: 10c0/71398b56139091414002bb81c21430bd82fa98fb2c98291b6a887f2f70d7e300471dbd529f573cb094a0da9a64b396b68979fcb5413c3df7c7eaeb68e91b5181
languageName: node
linkType: hard
@@ -8177,16 +8388,32 @@ __metadata:
languageName: node
linkType: hard
"blob-to-it@npm:^2.0.5":
version: 2.0.10
resolution: "blob-to-it@npm:2.0.10"
"blob-to-it@npm:^3.0.0":
version: 3.0.0
resolution: "blob-to-it@npm:3.0.0"
dependencies:
browser-readablestream-to-it: "npm:^2.0.0"
checksum: 10c0/9c133ab2dc077a3bc89e61947c5375732fedadd8a417d95073e2029ae2000b3818ac806af897297446a41330a97c1d38d6d320c09bf1980ef5fbc903c3f964dc
checksum: 10c0/1bfc924ed5c40dd223d6d6fed1b48aec2d461def6901ee9fefc18ac5ce1e0503bc560eb12df313a32c973172ab92b400821c59553f19169646d9136f3c67153d
languageName: node
linkType: hard
"blockstore-core@npm:6.1.2, blockstore-core@npm:^6.1.2":
"blockstore-core@npm:7.0.1, blockstore-core@npm:^7.0.1":
version: 7.0.1
resolution: "blockstore-core@npm:7.0.1"
dependencies:
"@libp2p/logger": "npm:^6.2.4"
abort-error: "npm:^1.0.2"
interface-blockstore: "npm:^7.0.0"
interface-store: "npm:^8.0.0"
it-all: "npm:^3.0.9"
it-filter: "npm:^3.1.4"
it-merge: "npm:^3.0.12"
multiformats: "npm:^14.0.0"
checksum: 10c0/be00facc94c6a350bb30d0aa9d235b8c0fe431d0627529c74be95f39b0882289585fe622066e6f2e5845a5b0fd4876e7a161a4d48a595cd3b66df13c7763b361
languageName: node
linkType: hard
"blockstore-core@npm:^6.1.2":
version: 6.1.2
resolution: "blockstore-core@npm:6.1.2"
dependencies:
@@ -8320,6 +8547,13 @@ __metadata:
languageName: node
linkType: hard
"browser-readablestream-to-it@npm:^2.0.12":
version: 2.0.12
resolution: "browser-readablestream-to-it@npm:2.0.12"
checksum: 10c0/470a82cd9422955a51aa895b8ba1b734ce7453da286fe4b5495ee68dde72ea0c7b9c2de755d155a70450f057b679c99a00da2865978454b2607d584f02f4c778
languageName: node
linkType: hard
"browserify-aes@npm:^1.0.4, browserify-aes@npm:^1.2.0":
version: 1.2.0
resolution: "browserify-aes@npm:1.2.0"
@@ -11823,6 +12057,16 @@ __metadata:
languageName: node
linkType: hard
"hamt-sharding@npm:^3.0.8":
version: 3.0.8
resolution: "hamt-sharding@npm:3.0.8"
dependencies:
sparse-array: "npm:^1.3.1"
uint8arrays: "npm:^6.1.1"
checksum: 10c0/01954d7d845b3aea80f8098a40e50cae3116736c57520d3189d838498c47c94ea98d7d514fd81434244141288a3344b5978d7190054bcd2470083b9f12a87ac9
languageName: node
linkType: hard
"handlebars@npm:^4.7.7":
version: 4.7.9
resolution: "handlebars@npm:4.7.9"
@@ -12427,7 +12671,17 @@ __metadata:
languageName: node
linkType: hard
"interface-datastore@npm:^10.0.1":
"interface-blockstore@npm:^7.0.0, interface-blockstore@npm:^7.0.1":
version: 7.0.1
resolution: "interface-blockstore@npm:7.0.1"
dependencies:
interface-store: "npm:^8.0.0"
multiformats: "npm:^14.0.0"
checksum: 10c0/5c1db76ac4013f863f8619ed341ddeffc28dd373046c7ac762c767e4853fb6a0e5016f8b73f6f99357dedb5162edcea5e7889d8a420d1706d673054ea2f01f70
languageName: node
linkType: hard
"interface-datastore@npm:^10.0.0, interface-datastore@npm:^10.0.1":
version: 10.0.1
resolution: "interface-datastore@npm:10.0.1"
dependencies:
@@ -12567,27 +12821,26 @@ __metadata:
languageName: node
linkType: hard
"ipfs-unixfs-importer@npm:16.1.4":
version: 16.1.4
resolution: "ipfs-unixfs-importer@npm:16.1.4"
"ipfs-unixfs-importer@npm:17.0.1":
version: 17.0.1
resolution: "ipfs-unixfs-importer@npm:17.0.1"
dependencies:
"@ipld/dag-pb": "npm:^4.1.5"
"@multiformats/murmur3": "npm:^2.1.8"
blockstore-core: "npm:^6.1.2"
hamt-sharding: "npm:^3.0.6"
interface-blockstore: "npm:^6.0.1"
interface-store: "npm:^7.0.0"
ipfs-unixfs: "npm:^12.0.0"
it-all: "npm:^3.0.9"
it-batch: "npm:^3.0.9"
it-first: "npm:^3.0.9"
it-parallel-batch: "npm:^3.0.9"
multiformats: "npm:^13.3.7"
progress-events: "npm:^1.0.1"
"@ipld/dag-pb": "npm:^4.1.7"
"@multiformats/murmur3": "npm:^2.2.5"
blockstore-core: "npm:^7.0.1"
hamt-sharding: "npm:^3.0.8"
interface-blockstore: "npm:^7.0.1"
ipfs-unixfs: "npm:^13.0.0"
it-all: "npm:^3.0.11"
it-batch: "npm:^3.0.11"
it-first: "npm:^3.0.11"
it-parallel-batch: "npm:^3.0.11"
multiformats: "npm:^14.0.0"
progress-events: "npm:^1.1.0"
rabin-wasm: "npm:^0.1.5"
uint8arraylist: "npm:^2.4.8"
uint8arrays: "npm:^5.1.0"
checksum: 10c0/4083010ee815ea6c90fad52f419f1f11a3f5f0eb3283ea6b3fc817d5ff390062ddd8700b8951f0845ec4607b73130f53d813b646bcb505b8b2ec7c207427f067
uint8arraylist: "npm:^3.0.2"
uint8arrays: "npm:^6.1.1"
checksum: 10c0/6c4198491175ace215d5896701ac2c5a67064775d2e0f8af09bf1e8fc7a2efc716fc1c7b7466e9bcd0da2915fac199a5495389edab5e26b13c82a2639c16bef3
languageName: node
linkType: hard
@@ -12657,6 +12910,16 @@ __metadata:
languageName: node
linkType: hard
"ipfs-unixfs@npm:^13.0.0":
version: 13.0.0
resolution: "ipfs-unixfs@npm:13.0.0"
dependencies:
protons-runtime: "npm:^7.0.0"
uint8arraylist: "npm:^3.0.2"
checksum: 10c0/1b73a481bcd0b5245fa54bf58816444c0f475ae2a8f796d93f722b775112d260f94cd04551e67bada4843a2784efa7821f240739e8accb0b56670a38ec8be9cd
languageName: node
linkType: hard
"ipfs-unixfs@npm:^4.0.3":
version: 4.0.3
resolution: "ipfs-unixfs@npm:4.0.3"
@@ -12682,7 +12945,25 @@ __metadata:
languageName: node
linkType: hard
"ipns@npm:10.1.3, ipns@npm:^10.0.2":
"ipns@npm:11.0.0":
version: 11.0.0
resolution: "ipns@npm:11.0.0"
dependencies:
"@libp2p/crypto": "npm:^5.0.0"
"@libp2p/interface": "npm:^3.0.2"
"@libp2p/logger": "npm:^6.0.4"
cborg: "npm:^5.1.0"
interface-datastore: "npm:^10.0.0"
multiformats: "npm:^14.0.0"
protons-runtime: "npm:^7.0.0"
timestamp-nano: "npm:^1.0.1"
uint8arraylist: "npm:^3.0.2"
uint8arrays: "npm:^6.1.1"
checksum: 10c0/7047ba05fc82454a39525e0c3f25c765cebb255837ba2c170b95853078d0a218a9007df46cabbd2ae7e688e1da74b94573ee9d5b6de56a3ed04399d8c8e0b452
languageName: node
linkType: hard
"ipns@npm:^10.0.2":
version: 10.1.3
resolution: "ipns@npm:10.1.3"
dependencies:
@@ -13369,6 +13650,13 @@ __metadata:
languageName: node
linkType: hard
"it-batch@npm:^3.0.11":
version: 3.0.11
resolution: "it-batch@npm:3.0.11"
checksum: 10c0/b540c817197323f32816926f8451e815ded51391a2eea1d2b13ac982e30fd9193ae00f9636dc2684913e235223201cc701d0c6627efea2870bc95c5cbb559f14
languageName: node
linkType: hard
"it-byte-stream@npm:^2.0.0":
version: 2.0.4
resolution: "it-byte-stream@npm:2.0.4"
@@ -13531,7 +13819,7 @@ __metadata:
languageName: node
linkType: hard
"it-map@npm:^3.1.5":
"it-map@npm:^3.1.5, it-map@npm:^3.1.6":
version: 3.1.6
resolution: "it-map@npm:3.1.6"
dependencies:
@@ -13567,6 +13855,15 @@ __metadata:
languageName: node
linkType: hard
"it-ndjson@npm:^2.0.0":
version: 2.0.0
resolution: "it-ndjson@npm:2.0.0"
dependencies:
uint8arraylist: "npm:^3.0.1"
checksum: 10c0/67bc6ba22b0af9411d365cce07ea2dde0d3de6080c88c6e1d23e2083277a6fc72351010ebb766fbf7aea467e1ac8ba96e9d7c278f11d4f82792392482a60f87b
languageName: node
linkType: hard
"it-parallel-batch@npm:^1.0.9":
version: 1.0.11
resolution: "it-parallel-batch@npm:1.0.11"
@@ -13576,6 +13873,15 @@ __metadata:
languageName: node
linkType: hard
"it-parallel-batch@npm:^3.0.11":
version: 3.0.11
resolution: "it-parallel-batch@npm:3.0.11"
dependencies:
it-batch: "npm:^3.0.0"
checksum: 10c0/dad34f8997fe3a0b9600b85668b1a47678830d559c85cfe821cc1dc9285f33724e8604cd086d2af79b8094fad8523e9e35455b845d6b3cb3d3e0e80f3756823b
languageName: node
linkType: hard
"it-parallel-batch@npm:^3.0.9":
version: 3.0.9
resolution: "it-parallel-batch@npm:3.0.9"
@@ -14084,12 +14390,12 @@ __metadata:
languageName: node
linkType: hard
"kubo-rpc-client@npm:6.1.0":
version: 6.1.0
resolution: "kubo-rpc-client@npm:6.1.0"
"kubo-rpc-client@npm:7.1.0":
version: 7.1.0
resolution: "kubo-rpc-client@npm:7.1.0"
dependencies:
"@ipld/dag-cbor": "npm:^9.0.0"
"@ipld/dag-json": "npm:^10.0.0"
"@ipld/dag-cbor": "npm:^10.0.1"
"@ipld/dag-json": "npm:^11.0.0"
"@ipld/dag-pb": "npm:^4.0.0"
"@libp2p/crypto": "npm:^5.0.0"
"@libp2p/interface": "npm:^3.0.2"
@@ -14098,12 +14404,12 @@ __metadata:
"@multiformats/multiaddr": "npm:^13.0.1"
"@multiformats/multiaddr-to-uri": "npm:^12.0.0"
any-signal: "npm:^4.1.1"
blob-to-it: "npm:^2.0.5"
blob-to-it: "npm:^3.0.0"
browser-readablestream-to-it: "npm:^2.0.5"
dag-jose: "npm:^5.0.0"
electron-fetch: "npm:^1.9.1"
err-code: "npm:^3.0.1"
ipfs-unixfs: "npm:^12.0.0"
ipfs-unixfs: "npm:^13.0.0"
iso-url: "npm:^1.2.1"
it-all: "npm:^3.0.4"
it-first: "npm:^3.0.4"
@@ -14113,13 +14419,13 @@ __metadata:
it-peekable: "npm:^3.0.3"
it-to-stream: "npm:^1.0.0"
merge-options: "npm:^3.0.4"
multiformats: "npm:^13.1.0"
multiformats: "npm:^14.0.0"
nanoid: "npm:^5.0.7"
parse-duration: "npm:^2.1.2"
stream-to-it: "npm:^1.0.1"
uint8arrays: "npm:^5.0.3"
uint8arrays: "npm:^6.1.1"
wherearewe: "npm:^2.0.1"
checksum: 10c0/31620eaf9f0d22caa32fcb58d674746b08fe656c5a1b4e116bc1834842878fd935e22229cb356a1266501accdc385441f37fec80839c086dac8bfcdac36e63f1
checksum: 10c0/aa85ea094a65086f5cde4e38456712935cd9a95eba42b0327ff677b4d691a97c588a4a633891abc21c78721c737015fa5709a964a39e54f6d607cb4d06ab39f9
languageName: node
linkType: hard
@@ -14146,7 +14452,42 @@ __metadata:
languageName: node
linkType: hard
"libp2p@npm:3.2.3, libp2p@npm:^3.2.0":
"libp2p@npm:3.3.3":
version: 3.3.3
resolution: "libp2p@npm:3.3.3"
dependencies:
"@chainsafe/is-ip": "npm:^2.1.0"
"@chainsafe/netmask": "npm:^2.0.0"
"@libp2p/crypto": "npm:^5.1.19"
"@libp2p/interface": "npm:^3.2.3"
"@libp2p/interface-internal": "npm:^3.1.6"
"@libp2p/logger": "npm:^6.2.8"
"@libp2p/multistream-select": "npm:^7.0.21"
"@libp2p/peer-collections": "npm:^7.0.21"
"@libp2p/peer-id": "npm:^6.0.10"
"@libp2p/peer-store": "npm:^12.0.21"
"@libp2p/utils": "npm:^7.2.2"
"@multiformats/dns": "npm:^1.0.6"
"@multiformats/multiaddr": "npm:^13.0.3"
"@multiformats/multiaddr-matcher": "npm:^3.0.2"
any-signal: "npm:^4.1.1"
datastore-core: "npm:^11.0.1"
interface-datastore: "npm:^9.0.1"
it-merge: "npm:^3.0.12"
it-parallel: "npm:^3.0.13"
main-event: "npm:^1.0.1"
multiformats: "npm:^14.0.0"
p-defer: "npm:^4.0.1"
p-event: "npm:^7.0.0"
p-retry: "npm:^8.0.0"
progress-events: "npm:^1.1.0"
race-signal: "npm:^2.0.0"
uint8arrays: "npm:^6.1.1"
checksum: 10c0/b29ea7bedbd4ec68e0029c886f80f9ec56ecb3a0b615cf0c8b6ce2a3b0cdbfb97edd3da904c973e849e36511018382cbe4bd30065128621c89203b273027549c
languageName: node
linkType: hard
"libp2p@npm:^3.2.0":
version: 3.2.3
resolution: "libp2p@npm:3.2.3"
dependencies:
@@ -15358,7 +15699,7 @@ __metadata:
languageName: node
linkType: hard
"multiformats@npm:^14.0.0":
"multiformats@npm:14.0.0, multiformats@npm:^14.0.0":
version: 14.0.0
resolution: "multiformats@npm:14.0.0"
checksum: 10c0/ec4b7d5ffa9dfb5b18274afb41c105c2d410e758b2c9242fdfbd938972c3a9796cabba74c214158b8732a41e1b5ba3c106c9dd5f1b7b19c4669c8f45b91db5cd
@@ -19980,12 +20321,12 @@ __metadata:
languageName: node
linkType: hard
"uint8arrays@npm:5.1.0, uint8arrays@npm:^5.0.0, uint8arrays@npm:^5.0.1, uint8arrays@npm:^5.0.2, uint8arrays@npm:^5.0.3, uint8arrays@npm:^5.1.0":
version: 5.1.0
resolution: "uint8arrays@npm:5.1.0"
"uint8arrays@npm:6.1.1, uint8arrays@npm:^6.0.0, uint8arrays@npm:^6.1.0, uint8arrays@npm:^6.1.1":
version: 6.1.1
resolution: "uint8arrays@npm:6.1.1"
dependencies:
multiformats: "npm:^13.0.0"
checksum: 10c0/e7587f97d03a17a608becd01b3ca52aa6db43e7ee6156c18b278c715a62f4f9e62ef2fe9432a3cd02791b6222a17578476a20b8e3ea37dd3b5ce454c6a8782a9
multiformats: "npm:^14.0.0"
checksum: 10c0/5814d69e5fada5d169ee8e88c750ad4ddf57a6ee86a7fe9534b86b55a147fab8e0b75d66cb1d2a1c6c2350526edd03e57a3ab5f0a0977c8ac13a6ce350c7b958
languageName: node
linkType: hard
@@ -19998,12 +20339,12 @@ __metadata:
languageName: node
linkType: hard
"uint8arrays@npm:^6.0.0, uint8arrays@npm:^6.1.0, uint8arrays@npm:^6.1.1":
version: 6.1.1
resolution: "uint8arrays@npm:6.1.1"
"uint8arrays@npm:^5.0.0, uint8arrays@npm:^5.0.1, uint8arrays@npm:^5.0.2, uint8arrays@npm:^5.1.0":
version: 5.1.0
resolution: "uint8arrays@npm:5.1.0"
dependencies:
multiformats: "npm:^14.0.0"
checksum: 10c0/5814d69e5fada5d169ee8e88c750ad4ddf57a6ee86a7fe9534b86b55a147fab8e0b75d66cb1d2a1c6c2350526edd03e57a3ab5f0a0977c8ac13a6ce350c7b958
multiformats: "npm:^13.0.0"
checksum: 10c0/e7587f97d03a17a608becd01b3ca52aa6db43e7ee6156c18b278c715a62f4f9e62ef2fe9432a3cd02791b6222a17578476a20b8e3ea37dd3b5ce454c6a8782a9
languageName: node
linkType: hard