snort/packages/nostr/test/test.direct-message.ts

127 lines
3.6 KiB
TypeScript

import { assert } from "chai"
import { EventKind } from "../src/event"
import { parsePublicKey } from "../src/crypto"
import { setup } from "./setup"
import { createDirectMessage } from "../src/event/direct-message"
describe("direct-message", () => {
const message = "for your eyes only"
// Test that the intended recipient can receive and decrypt the direct message.
it("to intended recipient", (done) => {
setup(
done,
({
publisher,
publisherPubkey,
publisherSecret,
subscriber,
subscriberPubkey,
subscriberSecret,
timestamp,
done,
}) => {
// Expect the direct message.
subscriber.on(
"event",
async ({ event, subscriptionId: actualSubscriptionId }, nostr) => {
assert.strictEqual(nostr, subscriber)
assert.strictEqual(event.kind, EventKind.DirectMessage)
assert.strictEqual(event.pubkey, parsePublicKey(publisherPubkey))
assert.strictEqual(actualSubscriptionId, subscriptionId)
assert.ok(event.created_at >= timestamp)
if (event.kind === EventKind.DirectMessage) {
assert.strictEqual(
event.getRecipient(),
parsePublicKey(subscriberPubkey)
)
assert.strictEqual(
await event.getMessage(subscriberSecret),
message
)
}
done()
}
)
const subscriptionId = subscriber.subscribe([])
subscriber.on("eose", async () => {
const event = await createDirectMessage(
{
message,
recipient: subscriberPubkey,
},
publisherSecret
)
publisher.publish(event)
})
}
)
})
// Test that an unintended recipient still receives the direct message event, but cannot decrypt it.
it("to unintended recipient", (done) => {
setup(
done,
({
publisher,
publisherPubkey,
publisherSecret,
subscriber,
subscriberSecret,
timestamp,
done,
}) => {
const recipientPubkey =
"npub1u2dl3scpzuwyd45flgtm3wcjgv20j4azuzgevdpgtsvvmqzvc63sz327gc"
// Expect the direct message.
subscriber.on(
"event",
async ({ event, subscriptionId: actualSubscriptionId }, nostr) => {
try {
assert.strictEqual(nostr, subscriber)
assert.strictEqual(event.kind, EventKind.DirectMessage)
assert.strictEqual(event.pubkey, parsePublicKey(publisherPubkey))
assert.strictEqual(actualSubscriptionId, subscriptionId)
assert.ok(event.created_at >= timestamp)
if (event.kind === EventKind.DirectMessage) {
assert.strictEqual(
event.getRecipient(),
parsePublicKey(recipientPubkey)
)
assert.strictEqual(
await event.getMessage(subscriberSecret),
undefined
)
}
done()
} catch (e) {
done(e)
}
}
)
const subscriptionId = subscriber.subscribe([])
subscriber.on("eose", async () => {
// TODO No signEvent, do something more convenient
const event = await createDirectMessage(
{
message,
recipient: recipientPubkey,
},
publisherSecret
)
publisher.publish(event)
})
}
)
})
})