Lint
This commit is contained in:
@@ -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)
|
||||
})
|
||||
})
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
+517
-490
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,4 @@
|
||||
import {on, nthEq, always, call, sleep, spec, ago, now} from "@welshman/lib"
|
||||
import {on, nthEq, always, call, sleep, ago, now} from "@welshman/lib"
|
||||
import {AUTH_JOIN, StampedEvent, SignedEvent} from "@welshman/util"
|
||||
import {
|
||||
ClientMessage,
|
||||
@@ -7,7 +7,6 @@ import {
|
||||
isClientEvent,
|
||||
isClientReq,
|
||||
isClientNegClose,
|
||||
ClientMessageType,
|
||||
RelayMessage,
|
||||
isRelayOk,
|
||||
isRelayEose,
|
||||
@@ -50,7 +49,7 @@ export const socketPolicyAuthBuffer = (socket: Socket) => {
|
||||
}),
|
||||
on(socket, SocketEvent.Receiving, (message: RelayMessage) => {
|
||||
// If the client is closing a request during auth, don't tell the caller, we'll retry it
|
||||
if (isRelayClosed(message) && message[2]?.startsWith('auth-required:')) {
|
||||
if (isRelayClosed(message) && message[2]?.startsWith("auth-required:")) {
|
||||
socket._recvQueue.remove(message)
|
||||
}
|
||||
|
||||
@@ -60,7 +59,7 @@ export const socketPolicyAuthBuffer = (socket: Socket) => {
|
||||
}
|
||||
|
||||
// If the client is rejecting an event during auth, don't tell the caller, we'll retry it
|
||||
if (isRelayOk(message) && !message[2] && message[3]?.startsWith('auth-required:')) {
|
||||
if (isRelayOk(message) && !message[2] && message[3]?.startsWith("auth-required:")) {
|
||||
socket._recvQueue.remove(message)
|
||||
}
|
||||
}),
|
||||
|
||||
@@ -289,7 +289,7 @@ export const makeLoader = (options: LoaderOptions) =>
|
||||
tracker,
|
||||
relays: [relay],
|
||||
autoClose: true,
|
||||
...options
|
||||
...options,
|
||||
})
|
||||
|
||||
let count = 0
|
||||
|
||||
Reference in New Issue
Block a user