Publish EVENT
RxNostr
の send()
メソッドを通じて EVENT メッセージを送信することができます。
send()
の第一引数は kind
と content
のみが必須で残りが省略可能な event オブジェクトです。指定されたパラメータは指定された値が (たとえ不正な値だったとしても) 尊重されます。一方、指定されなかったパラメータは、特に pubkey
, id
, sig
が signer
によって計算されます。
signer
は createRxNostr()
のオプションか、send()
の第二引数で渡すことができる署名器です。signer
が両方で指定された場合は send()
の第二引数に渡したものが使われます。通常の利用では createRxNostr()
のオプションに渡しておくのがいいでしょう。
import { createRxNostr, seckeySigner } from "rx-nostr";
const rxNostr = createRxNostr({
// nsec1... 形式と HEX 形式のどちらを渡しても動作します。
signer: seckeySigner("nsec1..."),
});
rxNostr.setDefaultRelays(["wss://nostr.example.com"]);
rxNostr.send({
kind: 1,
content: "Hello, Nostr!",
});
Note
デフォルトの signer
は nip07Signer()
です。これはランタイムから NIP-07 インターフェースを探し、それを利用して必要な値を計算します。
実際に送信される event オブジェクトの id
や pubkey
に興味がある場合もあるかもしれません。そのときは signer
を使って自分で計算することもできます。
import { createRxNostr, seckeySigner } from "rx-nostr";
const signer = seckeySigner("nsec1...");
const rxNostr = createRxNostr({
signer,
});
rxNostr.setDefaultRelays(["wss://nostr.example.com"]);
const eventParams = {
kind: 1,
content: "Hello, Nostr!",
};
const event = await signer.signEvent(eventParams);
rxNostr.send(event);
const id = event.id;
// event.pubkey と同じ値になります。
const pubkey = await signer.getPublicKey();
console.log(`${pubkey} は ${id} を送信しました。`);
Handling OK Messages
send()
の返り値は subscribe()
可能なオブジェクトです。これを subscribe()
することで、OK メッセージを待ち受けることができます。
rxNostr.send(event).subscribe((packet) => {
console.log(
`リレー ${packet.from} への送信が ${packet.ok ? "成功" : "失敗"} しました。`
);
});
WARNING
EVENT 送信の過程で NIP-42 に基づく AUTH を求められた場合、rx-nostr は AUTH の後に EVENT メッセージを自動で再送します。このシナリオでは同一のリレーから 2 つの OK メッセージを受け取りうることに注意してください。あるリレーから OK メッセージを受け取ったとき、2 回目の OK メッセージが届きうるかを確かめるには packet.done
が false
であることを確認します。
RxJS Tips
send()
の返り値は厳密には Observable です。この Observable は OK メッセージがこれ以上届き得ないと判断された時点で complete します。また、まだ OK メッセージが届き得るにも関わらず何も届かないまま 30 秒が経過したときには error で終了します。この待ち時間は createRxNostr()
の okTimeout
オプションで変更できます。