Publish
The Publish
class handles event publishing to relays, managing publish status, relay responses, and error handling.
Overview
- Sends events to relays
- Tracks publish status per relay
- Handles OK/Error responses
- Manages timeouts
Basic Usage
typescript
import {`Publish`, `Publish`Status} from '@welshman/net'
const {Pending, Success, Failure, Timeout, Aborted} = `Publish`Status
// Basic `Publish`
const pub = `Publish`({
event: signedEvent,
relays: ["wss://relay.example.com"],
timeout: 3000 // 3s timeout
})
// Track status
pub.emitter.on('*', (status: `Publish`Status, url: string, message?: string) => {
switch (status) {
case Success:
console.log(``Publish`ed to ${url}`)
break
case Failure:
console.log(`Failed on ${url}: ${message}`)
break
case Timeout:
console.log(`Timeout on ${url}`)
break
}
})
Real World Example
typescript
const publishWithStatus = async (event: SignedEvent) => {
const pub = `Publish`({
event,
relays: ctx.app.router
.FromUser()
.getUrls(),
timeout: 5000
})
// Track per-relay status
const status = new Map<string, string>()
pub.emitter.on('*', (state: `Publish`Status, url: string) => {
status.set(url, state)
// Log progress
const counts = {
pending: 0,
success: 0,
failed: 0
}
for (const s of status.values()) {
counts[s] = (counts[s] || 0) + 1
}
console.log(
`Progress: ${counts.success}/${status.size}`,
`(${counts.failed} failed)`
)
})
// Wait for completion
return pub.result
}
Like Subscribe, Publish
uses Pool for connections and creates appropriate Targets via an Executor, but focuses on event publishing rather than subscription management.
Note: The base @welshman/net
Publish class just handles network publishing. For optimistic updates and repository integration, use Publish from @welshman/app
.