Skip to content

Publish EVENT

RxNostrsend() メソッドを通じて EVENT メッセージを送信することができます。

send() の第一引数は kindcontent のみが必須で残りが省略可能な event オブジェクトです。指定されたパラメータは指定された値が (たとえ不正な値だったとしても) 尊重されます。一方、指定されなかったパラメータは、特に pubkey, id, sigsigner によって計算されます。

signercreateRxNostr() のオプションか、send() の第二引数で渡すことができる署名器です。signer が両方で指定された場合は send() の第二引数に渡したものが使われます。通常の利用では createRxNostr() のオプションに渡しておくのがいいでしょう。

ts
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

デフォルトの signernip07Signer() です。これはランタイムから NIP-07 インターフェースを探し、それを利用して必要な値を計算します。

実際に送信される event オブジェクトの idpubkey に興味がある場合もあるかもしれません。そのときは signer を使って自分で計算することもできます。

ts
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 メッセージを待ち受けることができます。

ts
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.donefalse であることを確認します。

RxJS Tips

send() の返り値は厳密には Observable です。この Observable は OK メッセージがこれ以上届き得ないと判断された時点で complete します。また、まだ OK メッセージが届き得るにも関わらず何も届かないまま 30 秒が経過したときには error で終了します。この待ち時間は createRxNostr()okTimeout オプションで変更できます。