This commit is contained in:
Jon Staab
2025-04-09 11:35:09 -07:00
parent 5f3624b8f3
commit 728ad1fba0
37 changed files with 1039 additions and 2183 deletions
+22 -20
View File
@@ -1,13 +1,12 @@
import EventEmitter from "events"
import { describe, expect, it, vi, beforeEach, afterEach } from "vitest"
import { isRelayUrl } from "@welshman/util"
import { LocalRelay, Repository, LOCAL_RELAY_URL } from "@welshman/relay"
import { AdapterEvent, SocketAdapter, LocalAdapter, getAdapter } from "../src/adapter"
import { ClientMessage, RelayMessage } from "../src/message"
import { Socket, SocketEvent } from "../src/socket"
import { Pool } from "../src/pool"
import {describe, expect, it, vi, beforeEach, afterEach} from "vitest"
import {LocalRelay, Repository, LOCAL_RELAY_URL} from "@welshman/relay"
import {AdapterEvent, SocketAdapter, LocalAdapter, getAdapter} from "../src/adapter"
import {ClientMessage, RelayMessage} from "../src/message"
import {Socket, SocketEvent} from "../src/socket"
import {Pool} from "../src/pool"
vi.mock('isomorphic-ws', () => {
vi.mock("isomorphic-ws", () => {
const WebSocket = vi.fn(function (this: any) {
setTimeout(() => this.onopen())
})
@@ -18,7 +17,7 @@ vi.mock('isomorphic-ws', () => {
this.onclose()
})
return { default: WebSocket }
return {default: WebSocket}
})
describe("SocketAdapter", () => {
@@ -27,7 +26,7 @@ describe("SocketAdapter", () => {
beforeEach(() => {
vi.useFakeTimers()
socket = new Socket('wss://test.relay')
socket = new Socket("wss://test.relay")
adapter = new SocketAdapter(socket)
})
@@ -48,15 +47,15 @@ describe("SocketAdapter", () => {
const receiveSpy = vi.fn()
adapter.on(AdapterEvent.Receive, receiveSpy)
const message: RelayMessage = ["EVENT", "123", { id: "123", kind: 1 }]
const message: RelayMessage = ["EVENT", "123", {id: "123", kind: 1}]
socket.emit(SocketEvent.Receive, message, "wss://test.relay")
expect(receiveSpy).toHaveBeenCalledWith(message, "wss://test.relay")
})
it("should send messages to socket", () => {
const sendSpy = vi.spyOn(socket, 'send')
const message: ClientMessage = ["EVENT", { id: "123", kind: 1 }]
const sendSpy = vi.spyOn(socket, "send")
const message: ClientMessage = ["EVENT", {id: "123", kind: 1}]
adapter.send(message)
expect(sendSpy).toHaveBeenCalledWith(message)
@@ -77,7 +76,7 @@ describe("LocalAdapter", () => {
const mockRelay = new EventEmitter()
Object.assign(mockRelay, {
send: vi.fn(),
removeAllListeners: vi.fn()
removeAllListeners: vi.fn(),
})
relay = mockRelay as unknown as LocalRelay & EventEmitter
adapter = new LocalAdapter(relay)
@@ -98,14 +97,14 @@ describe("LocalAdapter", () => {
const receiveSpy = vi.fn()
adapter.on(AdapterEvent.Receive, receiveSpy)
const message: RelayMessage = ["EVENT", "123", { id: "123", kind: 1 }]
const message: RelayMessage = ["EVENT", "123", {id: "123", kind: 1}]
relay.emit("*", ...message)
expect(receiveSpy).toHaveBeenCalledWith(message, LOCAL_RELAY_URL)
})
it("should send messages to relay", () => {
const message: ClientMessage = ["EVENT", { id: "123", kind: 1 }]
const message: ClientMessage = ["EVENT", {id: "123", kind: 1}]
adapter.send(message)
expect(relay.send).toHaveBeenCalledWith("EVENT", message[1])
@@ -136,13 +135,13 @@ describe("getAdapter", () => {
it("should return LocalAdapter for local relay URL", () => {
const url = LOCAL_RELAY_URL
const adapter = getAdapter(url, { repository })
const adapter = getAdapter(url, {repository})
expect(adapter).toBeInstanceOf(LocalAdapter)
})
it("should return SocketAdapter for remote relay URL", () => {
const url = "wss://test.relay"
const adapter = getAdapter(url, { pool })
const adapter = getAdapter(url, {pool})
expect(adapter).toBeInstanceOf(SocketAdapter)
})
@@ -151,9 +150,12 @@ describe("getAdapter", () => {
const getCustomAdapter = vi.fn().mockReturnValue(customAdapter)
const url = "wss://test.relay"
const adapter = getAdapter(url, { getAdapter: getCustomAdapter })
const adapter = getAdapter(url, {getAdapter: getCustomAdapter})
expect(getCustomAdapter).toHaveBeenCalledWith(url, expect.objectContaining({ getAdapter: getCustomAdapter }))
expect(getCustomAdapter).toHaveBeenCalledWith(
url,
expect.objectContaining({getAdapter: getCustomAdapter}),
)
expect(adapter).toBe(customAdapter)
})
})
+14 -15
View File
@@ -1,12 +1,11 @@
import { describe, expect, it, vi, beforeEach, afterEach } from "vitest"
import { Socket, SocketStatus, SocketEvent } from "../src/socket"
import { makeEvent, StampedEvent, CLIENT_AUTH } from "@welshman/util"
import { Nip01Signer } from "@welshman/signer"
import { AuthState, AuthStatus, AuthStateEvent, makeAuthEvent } from "../src/auth"
import EventEmitter from "events"
import { RelayMessage } from "../src/message"
import {describe, expect, it, vi, beforeEach, afterEach} from "vitest"
import {Socket, SocketStatus, SocketEvent} from "../src/socket"
import {StampedEvent, CLIENT_AUTH} from "@welshman/util"
import {Nip01Signer} from "@welshman/signer"
import {AuthStatus, AuthStateEvent} from "../src/auth"
import {RelayMessage} from "../src/message"
vi.mock('isomorphic-ws', () => {
vi.mock("isomorphic-ws", () => {
const WebSocket = vi.fn(function (this: any) {
setTimeout(() => this.onopen())
})
@@ -17,14 +16,14 @@ vi.mock('isomorphic-ws', () => {
this.onclose()
})
return { default: WebSocket }
return {default: WebSocket}
})
describe('auth', () => {
describe("auth", () => {
let socket: Socket
beforeEach(() => {
socket = new Socket('wss://test.relay')
socket = new Socket("wss://test.relay")
})
afterEach(() => {
@@ -72,7 +71,7 @@ describe('auth', () => {
})
it("should handle client AUTH message", () => {
const message: RelayMessage = ["AUTH", { id: "123", kind: CLIENT_AUTH }]
const message: RelayMessage = ["AUTH", {id: "123", kind: CLIENT_AUTH}]
socket.emit(SocketEvent.Sending, message)
expect(socket.auth.status).toBe(AuthStatus.PendingResponse)
@@ -113,7 +112,7 @@ describe('auth', () => {
const sign = vi.fn()
await expect(socket.auth.authenticate(sign)).rejects.toThrow(
"Attempted to authenticate with no challenge"
"Attempted to authenticate with no challenge",
)
})
@@ -124,7 +123,7 @@ describe('auth', () => {
socket.auth.status = AuthStatus.PendingResponse
await expect(socket.auth.authenticate(sign)).rejects.toThrow(
"Attempted to authenticate when auth is already auth:status:pending_response"
"Attempted to authenticate when auth is already auth:status:pending_response",
)
})
@@ -140,7 +139,7 @@ describe('auth', () => {
})
it("should send AUTH message", async () => {
const sendSpy = vi.spyOn(socket, 'send')
const sendSpy = vi.spyOn(socket, "send")
let event
socket.auth.challenge = "challenge123"
+58 -49
View File
@@ -1,14 +1,14 @@
import { AUTH_JOIN } from "@welshman/util"
import { describe, expect, it, vi, beforeEach, afterEach } from "vitest"
import { Socket, SocketStatus, SocketEvent } from "../src/socket"
import { AuthStatus, AuthStateEvent } from "../src/auth"
import {AUTH_JOIN} from "@welshman/util"
import {describe, expect, it, vi, beforeEach, afterEach} from "vitest"
import {Socket, SocketStatus, SocketEvent} from "../src/socket"
import {AuthStatus, AuthStateEvent} from "../src/auth"
import {
socketPolicyAuthBuffer,
socketPolicyConnectOnSend,
socketPolicyCloseOnTimeout,
socketPolicyReopenActive
socketPolicyReopenActive,
} from "../src/policy"
import { ClientMessage, RelayMessage } from "../src/message"
import {ClientMessage, RelayMessage} from "../src/message"
// Hoist mock definition to top level
const mockWs = vi.hoisted(() => ({
@@ -21,11 +21,11 @@ const mockWs = vi.hoisted(() => ({
}))
// Mock the WebSocket module
vi.mock('isomorphic-ws', () => ({
default: mockWs
vi.mock("isomorphic-ws", () => ({
default: mockWs,
}))
describe('policy', () => {
describe("policy", () => {
let socket: Socket
beforeEach(() => {
@@ -42,22 +42,22 @@ describe('policy', () => {
describe("socketPolicyAuthBuffer", () => {
it("should buffer messages when not authenticated", () => {
const cleanup = socketPolicyAuthBuffer(socket)
const sendSpy = vi.spyOn(socket, 'send')
const sendSpy = vi.spyOn(socket, "send")
socket.emit(SocketEvent.Receive, ["AUTH", "challenge"])
// Regular event should be buffered
const event: ClientMessage = ["EVENT", { id: "123"}]
const event: ClientMessage = ["EVENT", {id: "123"}]
socket.send(event)
expect(sendSpy).toHaveBeenCalledWith(event)
// Auth event should not be buffered
const authEvent: ClientMessage = ["AUTH", { id: "456" }]
const authEvent: ClientMessage = ["AUTH", {id: "456"}]
socket.send(authEvent)
expect(sendSpy).toHaveBeenCalledWith(authEvent)
// Auth join event should not be buffered
const joinEvent: ClientMessage = ["EVENT", { id: "789", kind: AUTH_JOIN }]
const joinEvent: ClientMessage = ["EVENT", {id: "789", kind: AUTH_JOIN}]
socket.send(joinEvent)
expect(sendSpy).toHaveBeenCalledWith(joinEvent)
@@ -66,18 +66,18 @@ describe('policy', () => {
it("should send buffered messages when auth succeeds", () => {
const cleanup = socketPolicyAuthBuffer(socket)
const sendSpy = vi.spyOn(socket, 'send')
const sendSpy = vi.spyOn(socket, "send")
socket.emit(SocketEvent.Receive, ["AUTH", "challenge"])
// Buffer some messages
const event1: ClientMessage = ["EVENT", { id: "123"}]
const event2: ClientMessage = ["EVENT", { id: "456"}]
const event1: ClientMessage = ["EVENT", {id: "123"}]
const event2: ClientMessage = ["EVENT", {id: "456"}]
socket.send(event1)
socket.send(event2)
// Auth succeeds
socket.send(["AUTH", { id: "auth" }])
socket.send(["AUTH", {id: "auth"}])
socket.emit(AuthStateEvent.Status, AuthStatus.Ok)
expect(sendSpy).toHaveBeenCalledWith(event1)
@@ -88,12 +88,12 @@ describe('policy', () => {
it("should handle CLOSE messages properly", () => {
const cleanup = socketPolicyAuthBuffer(socket)
const sendSpy = vi.spyOn(socket, 'send')
const sendSpy = vi.spyOn(socket, "send")
socket.emit(SocketEvent.Receive, ["AUTH", "challenge"])
// Buffer a REQ message
const req: ClientMessage = ["REQ", "123", { kinds: [1] }]
const req: ClientMessage = ["REQ", "123", {kinds: [1]}]
socket.send(req)
// Send CLOSE for buffered REQ
@@ -109,10 +109,13 @@ describe('policy', () => {
it("should retry events once when auth-required", () => {
const cleanup = socketPolicyAuthBuffer(socket)
const recvQueueRemoveSpy = vi.spyOn(socket._recvQueue, 'remove')
const recvQueueRemoveSpy = vi.spyOn(socket._recvQueue, "remove")
// Send an event
const event: ClientMessage = ["EVENT", { id: "123", kind: 1, content: "", tags: [], pubkey: "", sig: "" }]
const event: ClientMessage = [
"EVENT",
{id: "123", kind: 1, content: "", tags: [], pubkey: "", sig: ""},
]
socket.emit(SocketEvent.Send, event)
// Receive auth-required rejection
@@ -134,10 +137,10 @@ describe('policy', () => {
it("should retry REQ once when auth-required", () => {
const cleanup = socketPolicyAuthBuffer(socket)
const recvQueueRemoveSpy = vi.spyOn(socket._recvQueue, 'remove')
const recvQueueRemoveSpy = vi.spyOn(socket._recvQueue, "remove")
// Send a REQ
const req: ClientMessage = ["REQ", "123", { kinds: [1] }]
const req: ClientMessage = ["REQ", "123", {kinds: [1]}]
socket.emit(SocketEvent.Send, req)
// Receive auth-required rejection
@@ -159,10 +162,13 @@ describe('policy', () => {
it("should not retry AUTH_JOIN events", () => {
const cleanup = socketPolicyAuthBuffer(socket)
const sendSpy = vi.spyOn(socket, 'send')
const sendSpy = vi.spyOn(socket, "send")
// Send an AUTH_JOIN event
const event: ClientMessage = ["EVENT", { id: "123", kind: AUTH_JOIN, content: "", tags: [], pubkey: "", sig: "" }]
const event: ClientMessage = [
"EVENT",
{id: "123", kind: AUTH_JOIN, content: "", tags: [], pubkey: "", sig: ""},
]
socket.emit(SocketEvent.Send, event)
// Receive auth-required rejection
@@ -176,10 +182,13 @@ describe('policy', () => {
it("should clear pending messages on successful response", () => {
const cleanup = socketPolicyAuthBuffer(socket)
const sendSpy = vi.spyOn(socket, 'send')
const sendSpy = vi.spyOn(socket, "send")
// Send an event
const event: ClientMessage = ["EVENT", { id: "123", kind: 1, content: "", tags: [], pubkey: "", sig: "" }]
const event: ClientMessage = [
"EVENT",
{id: "123", kind: 1, content: "", tags: [], pubkey: "", sig: ""},
]
socket.emit(SocketEvent.Send, event)
// Receive successful response
@@ -198,13 +207,13 @@ describe('policy', () => {
describe("socketPolicyConnectOnSend", () => {
it("should open socket on send when closed", () => {
const cleanup = socketPolicyConnectOnSend(socket)
const openSpy = vi.spyOn(socket, 'open')
const openSpy = vi.spyOn(socket, "open")
// Socket starts closed
socket.emit(SocketEvent.Status, SocketStatus.Closed)
// Send a message
const event: ClientMessage = ["EVENT", { id: "123", kind: 1 }]
const event: ClientMessage = ["EVENT", {id: "123", kind: 1}]
socket.emit(SocketEvent.Sending, event)
// Should open the socket
@@ -215,13 +224,13 @@ describe('policy', () => {
it("should not open socket if already open", () => {
const cleanup = socketPolicyConnectOnSend(socket)
const openSpy = vi.spyOn(socket, 'open')
const openSpy = vi.spyOn(socket, "open")
// Socket is open
socket.emit(SocketEvent.Status, SocketStatus.Open)
// Send a message
const event: ClientMessage = ["EVENT", { id: "123", kind: 1 }]
const event: ClientMessage = ["EVENT", {id: "123", kind: 1}]
socket.emit(SocketEvent.Sending, event)
// Should not try to open the socket
@@ -232,14 +241,14 @@ describe('policy', () => {
it("should not open socket if there was a recent error", () => {
const cleanup = socketPolicyConnectOnSend(socket)
const openSpy = vi.spyOn(socket, 'open')
const openSpy = vi.spyOn(socket, "open")
// Socket has an error
socket.emit(SocketEvent.Status, SocketStatus.Error)
socket.emit(SocketEvent.Status, SocketStatus.Closed)
// Send a message
const event: ClientMessage = ["EVENT", { id: "123", kind: 1 }]
const event: ClientMessage = ["EVENT", {id: "123", kind: 1}]
socket.emit(SocketEvent.Sending, event)
// Should not try to open the socket due to recent error
@@ -261,7 +270,7 @@ describe('policy', () => {
describe("socketPolicyCloseOnTimeout", () => {
it("should close socket after 30 seconds of inactivity", async () => {
const cleanup = socketPolicyCloseOnTimeout(socket)
const closeSpy = vi.spyOn(socket, 'close')
const closeSpy = vi.spyOn(socket, "close")
// Set socket as open
socket.emit(SocketEvent.Status, SocketStatus.Open)
@@ -277,7 +286,7 @@ describe('policy', () => {
it("should reset timer on send activity", () => {
const cleanup = socketPolicyCloseOnTimeout(socket)
const closeSpy = vi.spyOn(socket, 'close')
const closeSpy = vi.spyOn(socket, "close")
// Set socket as open
socket.emit(SocketEvent.Status, SocketStatus.Open)
@@ -286,7 +295,7 @@ describe('policy', () => {
vi.advanceTimersByTime(20000)
// Send a message
socket.emit(SocketEvent.Send, ["EVENT", { id: "123" }])
socket.emit(SocketEvent.Send, ["EVENT", {id: "123"}])
// Advance time partially again
vi.advanceTimersByTime(20000)
@@ -305,7 +314,7 @@ describe('policy', () => {
it("should reset timer on receive activity", () => {
const cleanup = socketPolicyCloseOnTimeout(socket)
const closeSpy = vi.spyOn(socket, 'close')
const closeSpy = vi.spyOn(socket, "close")
// Set socket as open
socket.emit(SocketEvent.Status, SocketStatus.Open)
@@ -314,7 +323,7 @@ describe('policy', () => {
vi.advanceTimersByTime(20000)
// Receive a message
socket.emit(SocketEvent.Receive, ["EVENT", "123", { id: "123" }])
socket.emit(SocketEvent.Receive, ["EVENT", "123", {id: "123"}])
// Advance time partially again
vi.advanceTimersByTime(20000)
@@ -333,7 +342,7 @@ describe('policy', () => {
it("should not close socket if not open", () => {
const cleanup = socketPolicyCloseOnTimeout(socket)
const closeSpy = vi.spyOn(socket, 'close')
const closeSpy = vi.spyOn(socket, "close")
// Set socket as closed
socket.emit(SocketEvent.Status, SocketStatus.Closed)
@@ -351,10 +360,10 @@ describe('policy', () => {
describe("socketPolicyReopenActive", () => {
it("should reopen socket when closed with pending messages", async () => {
const cleanup = socketPolicyReopenActive(socket)
const sendSpy = vi.spyOn(socket, 'send')
const sendSpy = vi.spyOn(socket, "send")
// Send an event that will be pending
const event: ClientMessage = ["EVENT", { id: "123", kind: 1 }]
const event: ClientMessage = ["EVENT", {id: "123", kind: 1}]
socket.emit(SocketEvent.Send, event)
// Socket closes
@@ -371,10 +380,10 @@ describe('policy', () => {
it("should reopen socket when closed with pending requests", async () => {
const cleanup = socketPolicyReopenActive(socket)
const sendSpy = vi.spyOn(socket, 'send')
const sendSpy = vi.spyOn(socket, "send")
// Send a request that will be pending
const req: ClientMessage = ["REQ", "123", { kinds: [1] }]
const req: ClientMessage = ["REQ", "123", {kinds: [1]}]
socket.emit(SocketEvent.Send, req)
// Socket closes
@@ -391,10 +400,10 @@ describe('policy', () => {
it("should not reopen socket immediately after previous open", async () => {
const cleanup = socketPolicyReopenActive(socket)
const sendSpy = vi.spyOn(socket, 'send')
const sendSpy = vi.spyOn(socket, "send")
// Send an event that will be pending
const event: ClientMessage = ["EVENT", { id: "123", kind: 1 }]
const event: ClientMessage = ["EVENT", {id: "123", kind: 1}]
socket.emit(SocketEvent.Send, event)
// Socket opens then closes quickly
@@ -418,10 +427,10 @@ describe('policy', () => {
it("should remove pending messages when they complete", () => {
const cleanup = socketPolicyReopenActive(socket)
const sendSpy = vi.spyOn(socket, 'send')
const sendSpy = vi.spyOn(socket, "send")
// Send an event that will be pending
const event: ClientMessage = ["EVENT", { id: "123", kind: 1 }]
const event: ClientMessage = ["EVENT", {id: "123", kind: 1}]
socket.emit(SocketEvent.Send, event)
// Event completes successfully
@@ -441,10 +450,10 @@ describe('policy', () => {
it("should remove pending messages when closed", () => {
const cleanup = socketPolicyReopenActive(socket)
const sendSpy = vi.spyOn(socket, 'send')
const sendSpy = vi.spyOn(socket, "send")
// Send a request that will be pending
const req: ClientMessage = ["REQ", "123", { kinds: [1] }]
const req: ClientMessage = ["REQ", "123", {kinds: [1]}]
socket.emit(SocketEvent.Send, req)
// Send close for the request
+7 -8
View File
@@ -1,9 +1,8 @@
import { describe, expect, it, vi, beforeEach, afterEach } from "vitest"
import { Socket } from "../src/socket"
import { Pool, makeSocket } from "../src/pool"
import { normalizeRelayUrl } from "@welshman/util"
import {describe, expect, it, vi, beforeEach, afterEach} from "vitest"
import {Socket} from "../src/socket"
import {Pool} from "../src/pool"
vi.mock('isomorphic-ws', () => {
vi.mock("isomorphic-ws", () => {
const WebSocket = vi.fn(function (this: any) {
setTimeout(() => this.onopen())
})
@@ -14,7 +13,7 @@ vi.mock('isomorphic-ws', () => {
this.onclose()
})
return { default: WebSocket }
return {default: WebSocket}
})
describe("Pool", () => {
@@ -95,7 +94,7 @@ describe("Pool", () => {
describe("remove", () => {
it("should remove and cleanup existing socket", () => {
const mockSocket = { url: "wss://test.relay", cleanup: vi.fn() }
const mockSocket = {url: "wss://test.relay", cleanup: vi.fn()}
pool._data.set(mockSocket.url, mockSocket as unknown as Socket)
pool.remove(mockSocket.url)
@@ -113,7 +112,7 @@ describe("Pool", () => {
describe("clear", () => {
it("should remove all sockets", () => {
const urls = ["wss://test1.relay", "wss://test2.relay"]
const mockSockets = urls.map(url => ({ url, cleanup: vi.fn() }))
const mockSockets = urls.map(url => ({url, cleanup: vi.fn()}))
for (const mockSocket of mockSockets) {
pool._data.set(mockSocket.url, mockSocket as unknown as Socket)
+28 -26
View File
@@ -1,10 +1,9 @@
import { describe, expect, it, vi, beforeEach, afterEach } from "vitest"
import { EventEmitter } from "events"
import { SinglePublish, MultiPublish, PublishEvent, PublishStatus, } from "../src/publish"
import { AbstractAdapter, AdapterEvent, MockAdapter } from "../src/adapter"
import { ClientMessageType, RelayMessage } from "../src/message"
import { SignedEvent, makeEvent } from "@welshman/util"
import { Nip01Signer } from '@welshman/signer'
import {describe, expect, it, vi, beforeEach, afterEach} from "vitest"
import {SinglePublish, MultiPublish, PublishEvent} from "../src/publish"
import {MockAdapter} from "../src/adapter"
import {ClientMessageType} from "../src/message"
import {makeEvent} from "@welshman/util"
import {Nip01Signer} from "@welshman/signer"
describe("SinglePublish", () => {
beforeEach(() => {
@@ -17,12 +16,12 @@ describe("SinglePublish", () => {
it("success works", async () => {
const sendSpy = vi.fn()
const adapter = new MockAdapter('1', sendSpy)
const adapter = new MockAdapter("1", sendSpy)
const signer = Nip01Signer.ephemeral()
const event = await signer.sign(makeEvent(1))
const pub = new SinglePublish({
relay: '1',
relay: "1",
context: {getAdapter: () => adapter},
event,
})
@@ -50,12 +49,12 @@ describe("SinglePublish", () => {
it("failure works", async () => {
const sendSpy = vi.fn()
const adapter = new MockAdapter('1', sendSpy)
const adapter = new MockAdapter("1", sendSpy)
const signer = Nip01Signer.ephemeral()
const event = await signer.sign(makeEvent(1))
const pub = new SinglePublish({
relay: '1',
relay: "1",
context: {getAdapter: () => adapter},
event,
})
@@ -83,12 +82,12 @@ describe("SinglePublish", () => {
it("timeout works", async () => {
const sendSpy = vi.fn()
const adapter = new MockAdapter('1', sendSpy)
const adapter = new MockAdapter("1", sendSpy)
const signer = Nip01Signer.ephemeral()
const event = await signer.sign(makeEvent(1))
const pub = new SinglePublish({
relay: '1',
relay: "1",
context: {getAdapter: () => adapter},
event,
})
@@ -117,12 +116,12 @@ describe("SinglePublish", () => {
it("abort works", async () => {
const sendSpy = vi.fn()
const adapter = new MockAdapter('1', sendSpy)
const adapter = new MockAdapter("1", sendSpy)
const signer = Nip01Signer.ephemeral()
const event = await signer.sign(makeEvent(1))
const pub = new SinglePublish({
relay: '1',
relay: "1",
context: {getAdapter: () => adapter},
event,
})
@@ -163,27 +162,31 @@ describe("MultiPublish", () => {
it("should all basically work", async () => {
const send1Spy = vi.fn()
const adapter1 = new MockAdapter('1', send1Spy)
const adapter1 = new MockAdapter("1", send1Spy)
const send2Spy = vi.fn()
const adapter2 = new MockAdapter('2', send2Spy)
const adapter2 = new MockAdapter("2", send2Spy)
const send3Spy = vi.fn()
const adapter3 = new MockAdapter('3', send3Spy)
const adapter3 = new MockAdapter("3", send3Spy)
const signer = Nip01Signer.ephemeral()
const event = await signer.sign(makeEvent(1))
const pub = new MultiPublish({
event,
relays: ['1', '2', '3'],
relays: ["1", "2", "3"],
context: {
getAdapter: (url: string) => {
switch(url) {
case '1': return adapter1
case '2': return adapter2
case '3': return adapter3
default: throw new Error(`Unknown relay: ${url}`)
switch (url) {
case "1":
return adapter1
case "2":
return adapter2
case "3":
return adapter3
default:
throw new Error(`Unknown relay: ${url}`)
}
},
}
},
})
const successSpy = vi.fn()
@@ -199,7 +202,6 @@ describe("MultiPublish", () => {
adapter1.receive(["OK", event.id, true, "hi"])
adapter2.receive(["OK", event.id, false, "hi"])
await vi.runAllTimers()
expect(successSpy).toHaveBeenCalledWith(event.id, "hi", "1")
+16 -17
View File
@@ -1,9 +1,9 @@
import { describe, expect, it, vi, beforeEach, afterEach } from "vitest"
import { Nip01Signer } from '@welshman/signer'
import { makeEvent } from '@welshman/util'
import { ClientMessageType } from "../src/message"
import { MockAdapter } from "../src/adapter"
import { SingleRequest, MultiRequest, RequestEvent } from "../src/request"
import {describe, expect, it, vi, beforeEach, afterEach} from "vitest"
import {Nip01Signer} from "@welshman/signer"
import {makeEvent} from "@welshman/util"
import {ClientMessageType} from "../src/message"
import {MockAdapter} from "../src/adapter"
import {SingleRequest, MultiRequest, RequestEvent} from "../src/request"
describe("SingleRequest", () => {
beforeEach(() => {
@@ -16,9 +16,9 @@ describe("SingleRequest", () => {
it("everything basically works", async () => {
const sendSpy = vi.fn()
const adapter = new MockAdapter('1', sendSpy)
const adapter = new MockAdapter("1", sendSpy)
const req = new SingleRequest({
relay: 'whatever',
relay: "whatever",
filters: [{kinds: [1]}],
context: {getAdapter: () => adapter},
})
@@ -82,14 +82,14 @@ describe("MultiRequest", () => {
it("everything basically works", async () => {
const send1Spy = vi.fn()
const adapter1 = new MockAdapter('1', send1Spy)
const adapter1 = new MockAdapter("1", send1Spy)
const send2Spy = vi.fn()
const adapter2 = new MockAdapter('2', send2Spy)
const adapter2 = new MockAdapter("2", send2Spy)
const req = new MultiRequest({
relays: ['1', '2'],
relays: ["1", "2"],
filters: [{kinds: [1]}],
context: {
getAdapter: (url: string) => url === '1' ? adapter1 : adapter2
getAdapter: (url: string) => (url === "1" ? adapter1 : adapter2),
},
})
@@ -129,10 +129,10 @@ describe("MultiRequest", () => {
await vi.runAllTimersAsync()
expect(duplicateSpy).toHaveBeenCalledWith(event1, '2')
expect(filteredSpy).toHaveBeenCalledWith(event2, '1')
expect(invalidSpy).toHaveBeenCalledWith(event3, '1')
expect(eventSpy).toHaveBeenCalledWith(event1, '1')
expect(duplicateSpy).toHaveBeenCalledWith(event1, "2")
expect(filteredSpy).toHaveBeenCalledWith(event2, "1")
expect(invalidSpy).toHaveBeenCalledWith(event3, "1")
expect(eventSpy).toHaveBeenCalledWith(event1, "1")
expect(eoseSpy).toHaveBeenCalledTimes(0)
adapter1.receive(["EOSE", id1])
@@ -145,4 +145,3 @@ describe("MultiRequest", () => {
expect(closeSpy).toHaveBeenCalledTimes(1)
})
})
+12 -11
View File
@@ -1,10 +1,9 @@
import { sleep } from "@welshman/lib"
import WebSocket from 'isomorphic-ws'
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"
import { Socket, SocketStatus, SocketEvent } from "../src/socket"
import { ClientMessage, RelayMessage } from "../src/message"
import WebSocket from "isomorphic-ws"
import {afterEach, beforeEach, describe, expect, it, vi} from "vitest"
import {Socket, SocketStatus, SocketEvent} from "../src/socket"
import {ClientMessage, RelayMessage} from "../src/message"
vi.mock('isomorphic-ws', () => {
vi.mock("isomorphic-ws", () => {
const WebSocket = vi.fn(function (this: any) {
setTimeout(() => this.onopen())
})
@@ -15,7 +14,7 @@ vi.mock('isomorphic-ws', () => {
this.onclose()
})
return { default: WebSocket }
return {default: WebSocket}
})
describe("Socket", () => {
@@ -77,9 +76,11 @@ describe("Socket", () => {
socket.open()
const closeSpy = vi.spyOn(socket._ws, "close")
socket.close()
expect(socket._ws!.close).toHaveBeenCalled()
expect(closeSpy).toHaveBeenCalled()
expect(statusSpy).toHaveBeenCalledWith(SocketStatus.Closed, "wss://test.relay")
})
})
@@ -89,7 +90,7 @@ describe("Socket", () => {
const enqueueSpy = vi.fn()
socket.on(SocketEvent.Sending, enqueueSpy)
const message: ClientMessage = ["EVENT", { id: "123", kind: 1 }]
const message: ClientMessage = ["EVENT", {id: "123", kind: 1}]
socket.send(message)
expect(enqueueSpy).toHaveBeenCalledWith(message, "wss://test.relay")
@@ -102,7 +103,7 @@ describe("Socket", () => {
socket.open()
socket._ws?.onopen?.(undefined as unknown as any)
const message: ClientMessage = ["EVENT", { id: "123", kind: 1 }]
const message: ClientMessage = ["EVENT", {id: "123", kind: 1}]
socket.send(message)
await vi.runAllTimers()
@@ -118,7 +119,7 @@ describe("Socket", () => {
socket.on(SocketEvent.Receive, receiveSpy)
socket.open()
const message: RelayMessage = ["EVENT", "123", { id: "123", kind: 1 }]
const message: RelayMessage = ["EVENT", "123", {id: "123", kind: 1}]
socket._ws?.onmessage?.({data: JSON.stringify(message)} as unknown as any)
await vi.runAllTimers()