node-red-contrib-nostr
Version:
Node-RED nodes for seamless Nostr protocol integration. Features robust WebSocket handling, event filtering, and NPUB-based routing. Built with TypeScript for type safety and extensive testing. Perfect for Nostr automation flows.
59 lines (58 loc) • 1.95 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.EventBuilder = void 0;
const sha2_js_1 = require("@noble/hashes/sha2.js");
const utils_js_1 = require("@noble/hashes/utils.js");
const keys_1 = require("../crypto/keys");
class EventBuilder {
static async createEvent(kind, content, privateKey, tags = []) {
const pubkey = await this.keyManager.getPublicKey(privateKey);
const created_at = Math.floor(Date.now() / 1000);
const event = {
kind,
content,
created_at,
pubkey,
tags,
id: '',
sig: ''
};
// Calculate event ID
const serialized = JSON.stringify([
0,
event.pubkey,
event.created_at,
event.kind,
event.tags,
event.content
]);
event.id = (0, utils_js_1.bytesToHex)((0, sha2_js_1.sha256)(Buffer.from(serialized)));
// Sign the event
event.sig = await this.keyManager.sign(privateKey, event.id);
return event;
}
static async validateEvent(event) {
// Verify all required fields exist
if (!event.id || !event.pubkey || !event.created_at ||
!event.kind || !event.tags || !event.content || !event.sig) {
return false;
}
// Verify event ID
const serialized = JSON.stringify([
0,
event.pubkey,
event.created_at,
event.kind,
event.tags,
event.content
]);
const id = (0, utils_js_1.bytesToHex)((0, sha2_js_1.sha256)(Buffer.from(serialized)));
if (id !== event.id) {
return false;
}
// Verify signature
return await this.keyManager.verify(event.pubkey, event.id, event.sig);
}
}
exports.EventBuilder = EventBuilder;
EventBuilder.keyManager = new keys_1.KeyManager();