@shocknet/clink-sdk
Version:
sdk client for clink
68 lines • 3.39 kB
JavaScript
import { nip44, finalizeEvent } from "nostr-tools";
const { getConversationKey, decrypt } = nip44;
export const sendRequest = async (pool, pair, relays, toPub, e, kindExpected, timeoutSeconds, moreCb) => {
const signed = finalizeEvent(e, pair.privateKey);
console.log(`[ClinkSDK] Sending request: kind=${kindExpected}, eventId=${signed.id}, toPub=${toPub}, relays=${relays.join(',')}, timeout=${timeoutSeconds}s`);
return new Promise((res, rej) => {
let resolved = false;
let closer = { close: () => { } };
let timer = null;
const filter = newFilter(pair.publicKey, signed.id, kindExpected);
console.log(`[ClinkSDK] Setting up subscription with filter:`, JSON.stringify(filter, null, 2));
if (timeoutSeconds) {
timer = setTimeout(() => {
console.log(`[ClinkSDK] Timeout after ${timeoutSeconds}s - no response received for kind=${kindExpected}, eventId=${signed.id}`);
console.log(`[ClinkSDK] Closing subscription for eventId=${signed.id}`);
closer.close();
rej('failed to get response in time');
}, timeoutSeconds * 1000);
}
try {
// Set up subscription BEFORE publishing to avoid race condition
closer = pool.subscribeMany(relays, [filter], {
onevent: async (e) => {
console.log(`[ClinkSDK] Received response event: kind=${e.kind}, eventId=${e.id}, from=${e.pubkey}`);
if (timer)
clearTimeout(timer);
const content = decrypt(e.content, getConversationKey(pair.privateKey, toPub));
if (!resolved) {
resolved = true;
console.log(`[ClinkSDK] Response resolved successfully for eventId=${signed.id}`);
res(JSON.parse(content));
}
else {
console.log(`[ClinkSDK] Additional response received for eventId=${signed.id}, calling moreCb`);
moreCb?.(JSON.parse(content));
}
},
oneose: () => {
console.log(`[ClinkSDK] End of stored events received for eventId=${signed.id}`);
}
});
console.log(`[ClinkSDK] Subscription established for eventId=${signed.id}`);
// Publish AFTER subscription is set up to avoid missing the response
Promise.all(pool.publish(relays, signed)).then(() => {
console.log(`[ClinkSDK] Request published to ${relays.length} relays, waiting for response...`);
}).catch((error) => {
console.error(`[ClinkSDK] Failed to publish to relays:`, error);
if (timer)
clearTimeout(timer);
closer.close();
rej(error);
});
}
catch (error) {
console.error(`[ClinkSDK] Failed to establish subscription:`, error);
if (timer)
clearTimeout(timer);
rej(error);
}
});
};
export const newFilter = (publicKey, eventId, kindExpected) => ({
since: Math.floor(Date.now() / 1000) - 1,
kinds: [kindExpected],
'#p': [publicKey],
'#e': [eventId]
});
//# sourceMappingURL=sender.js.map