async sendToPeer(peerId, topic, data, options = {}) {
		try {
			// Ensure node is available
			if (!this.node) {
				logTE('p2p', 'Cannot send message - node not initialized');
				return false;
			}

			// For specific peer, check protocol verification except for init messages
			if (peerId && 
				topic !== `${this.protocol}/init` && 
				this.peers.has(peerId) && 
				!this.peers.get(peerId)[this.protocolName]) {
				logTW('p2p', `Cannot send message to unverified peer ${peerId} on topic ${topic}`);
				return false;
			}

			// Serialize message once
			if (peerId) {
				data.topic = topic;
			}
			const message = Buffer.from(JSON.stringify(data));
			
			if (peerId) {
				// For specific peer, use direct dial
				try {
					await this._sendProtocolStreamData(peerId, message);
					logT('p2p', `Sent direct message to peer ${peerId} on topic ${topic}`);
					return true;
				} catch (err) {
					if (!options.silent) {
						logTW('p2p', `Error dialing peer ${peerId}`, err);
					}
					return false;
				}
			} else {
				// For broadcast, use pubsub
				if (!this.node.services.pubsub) {
					logTE('p2p', 'Cannot broadcast - pubsub not available');
					return false;
				}
				
				logT('p2p', `Broadcast message to topic ${topic}`);
				await this.node.services.pubsub.publish(topic, message);
				return true;
			}

		} catch (err) {
			const peerInfo = peerId ? `peer ${peerId}` : 'topic broadcast';
			logTW('p2p', `Error sending message to ${peerInfo}`, err);
			return false;
		}
	}
Send message to specific peer or topic
@param {string} peerId - ID of the peer (null for broadcast)
@param {string} topic - Topic to publish to
@param {Object} data - Data to send
@returns {boolean} Success status