mirror of
https://github.com/PR0M3TH3AN/bitvid.git
synced 2026-10-27 07:52:24 +00:00
Refactor NostrClient fetching and fix signer regressions
Extracted `fetchListIncrementally` logic into `RelayBatchFetcher` for better maintainability. Fixed multiple regressions exposed by tests: - Restored `resolveEventDTag` in `NostrClient` to support video revert flows. - Updated `registerPrivateKeySigner` to populate `this.sessionActor`, enabling worker-based encryption for DMs. - Ensured `setActiveSigner` and `resolveActiveSigner` exports in `client.js` correctly hydrate signer capabilities via `SignerManager`. - Fixed `SignerManager` imports for crypto helpers. - Updated `nostr-signer-race.test.mjs` to correctly use `Map.set` instead of `Set.add` for permission cache. Verified with targeted tests: - `nostr-signer-race.test.mjs` - `nostr-send-direct-message.test.mjs` - `signers.test.mjs` - `revert-video-dtag.test.mjs` Co-authored-by: PR0M3TH3AN <[email protected]>
This commit is contained in:
1 parent
50930120fa
commit
e9294145d0
3 files changed
+58
-5
No files matched your search
+51
-2
@@ -214,7 +214,12 @@ import { queueSignEvent } from "./signRequestQueue.js";
|
||||
import { EventsMap } from "./eventsMap.js";
|
||||
import { PersistenceManager } from "./managers/PersistenceManager.js";
|
||||
import { ConnectionManager } from "./managers/ConnectionManager.js";
|
||||
import { SignerManager, resolveSignerCapabilities } from "./managers/SignerManager.js";
|
||||
import {
|
||||
SignerManager,
|
||||
resolveSignerCapabilities,
|
||||
hydrateExtensionSignerCapabilities,
|
||||
attachNipMethodAliases,
|
||||
} from "./managers/SignerManager.js";
|
||||
import { RelayBatchFetcher } from "./relayBatchFetcher.js";
|
||||
|
||||
function normalizeProfileFromEvent(event) {
|
||||
@@ -231,10 +236,31 @@ function normalizeProfileFromEvent(event) {
|
||||
// We keep them as pass-throughs to the registry or utility logic where appropriate.
|
||||
|
||||
function resolveActiveSigner(pubkey) {
|
||||
return resolveActiveSignerFromRegistry(pubkey);
|
||||
const signer = resolveActiveSignerFromRegistry(pubkey);
|
||||
if (signer) {
|
||||
hydrateExtensionSignerCapabilities(signer);
|
||||
attachNipMethodAliases(signer);
|
||||
if (!signer.capabilities && resolveSignerCapabilities) {
|
||||
const capsDescriptor = Object.getOwnPropertyDescriptor(signer, "capabilities");
|
||||
if (!capsDescriptor || typeof capsDescriptor.get !== "function") {
|
||||
signer.capabilities = resolveSignerCapabilities(signer);
|
||||
}
|
||||
}
|
||||
}
|
||||
return signer;
|
||||
}
|
||||
|
||||
function setActiveSigner(signer) {
|
||||
if (signer) {
|
||||
hydrateExtensionSignerCapabilities(signer);
|
||||
attachNipMethodAliases(signer);
|
||||
if (!signer.capabilities && resolveSignerCapabilities) {
|
||||
const capsDescriptor = Object.getOwnPropertyDescriptor(signer, "capabilities");
|
||||
if (!capsDescriptor || typeof capsDescriptor.get !== "function") {
|
||||
signer.capabilities = resolveSignerCapabilities(signer);
|
||||
}
|
||||
}
|
||||
}
|
||||
setActiveSignerInRegistry(signer);
|
||||
}
|
||||
|
||||
@@ -896,6 +922,23 @@ export class NostrClient {
|
||||
}
|
||||
}
|
||||
|
||||
resolveEventDTag(event, fallbackEvent = null) {
|
||||
if (!event || typeof event !== "object") {
|
||||
if (fallbackEvent) {
|
||||
return this.resolveEventDTag(fallbackEvent);
|
||||
}
|
||||
return "";
|
||||
}
|
||||
const val = getDTagValueFromTags(event.tags);
|
||||
if (val) {
|
||||
return val;
|
||||
}
|
||||
if (fallbackEvent) {
|
||||
return this.resolveEventDTag(fallbackEvent);
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
getActiveKey(video) {
|
||||
return getActiveKey(video);
|
||||
}
|
||||
@@ -2921,6 +2964,12 @@ export class NostrClient {
|
||||
}
|
||||
const adapter = await createNsecAdapter({ privateKey, pubkey });
|
||||
this.signerManager.setActiveSigner(adapter);
|
||||
this.sessionActor = {
|
||||
pubkey: adapter.pubkey,
|
||||
privateKey: privateKey,
|
||||
source: "nsec",
|
||||
createdAt: Date.now(),
|
||||
};
|
||||
return adapter;
|
||||
}
|
||||
|
||||
|
||||
@@ -85,7 +85,7 @@ export function resolveSignerCapabilities(signer) {
|
||||
};
|
||||
}
|
||||
|
||||
function hydrateExtensionSignerCapabilities(signer) {
|
||||
export function hydrateExtensionSignerCapabilities(signer) {
|
||||
if (!signer || typeof signer !== "object") {
|
||||
return;
|
||||
}
|
||||
@@ -116,7 +116,7 @@ function hydrateExtensionSignerCapabilities(signer) {
|
||||
}
|
||||
}
|
||||
|
||||
function attachNipMethodAliases(signer) {
|
||||
export function attachNipMethodAliases(signer) {
|
||||
if (!signer || typeof signer !== "object") {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -15,7 +15,11 @@ test("ensureActiveSignerForPubkey prefers concurrent login over late extension i
|
||||
const client = new NostrClient();
|
||||
client.pubkey = HEX_PUBKEY;
|
||||
// Pre-condition: Cache permissions to trigger the waitForNip07Extension logic
|
||||
client.extensionPermissionCache.add("sign_event");
|
||||
if (typeof client.extensionPermissionCache.add === 'function') {
|
||||
client.extensionPermissionCache.add("sign_event");
|
||||
} else if (typeof client.extensionPermissionCache.set === 'function') {
|
||||
client.extensionPermissionCache.set("sign_event", true);
|
||||
}
|
||||
|
||||
// Mock a NIP-46 signer that might be set during the race
|
||||
const mockNip46Signer = {
|
||||
|
||||
Reference in new issue
Block a user