Clean up nostr-tools dependencies

This commit is contained in:
Jon Staab
2025-04-01 10:50:43 -07:00
parent 04816f8377
commit 5ad6347123
10 changed files with 75 additions and 50 deletions
+16 -4
View File
@@ -1,14 +1,26 @@
import {throttle} from "@welshman/lib"
import {Repository, LocalRelay} from "@welshman/relay"
import {Tracker} from "@welshman/net"
import {verifyEvent, isEphemeralKind, isDVMKind} from "@welshman/util"
import {Repository} from "@welshman/relay"
import {Pool, Tracker, SocketEvent, isRelayEvent} from "@welshman/net"
import {custom} from "@welshman/store"
export const repository = Repository.getSingleton()
export const relay = new LocalRelay(repository)
export const tracker = new Tracker()
Pool.getSingleton().subscribe(socket => {
socket.on(SocketEvent.Receive, message => {
if (isRelayEvent(message)) {
const event = message[2]
if (!isEphemeralKind(event.kind) && !isDVMKind(event.kind) && verifyEvent(event)) {
tracker.track(event.id, socket.url)
repository.publish(event)
}
}
})
})
// Adapt above objects to stores
export const makeRepositoryStore = ({throttle: t = 300}: {throttle?: number} = {}) =>
+1 -1
View File
@@ -30,6 +30,6 @@
"@welshman/lib": "^0.1.0",
"@welshman/net": "^0.0.49",
"@welshman/util": "^0.1.0",
"nostr-tools": "^2.7.2"
"@welshman/signer": "^0.1.1"
}
}
+9 -6
View File
@@ -1,6 +1,5 @@
import {hexToBytes} from "@noble/hashes/utils"
import {getPublicKey, finalizeEvent} from "nostr-tools/pure"
import {now} from "@welshman/lib"
import {Nip01Signer} from "@welshman/signer"
import {TrustedEvent, StampedEvent, Filter} from "@welshman/util"
import {MultiRequest, MultiPublish, PublishEvent, RequestEvent, AdapterContext} from "@welshman/net"
@@ -25,8 +24,11 @@ export class DVM {
logEvents = false
seen = new Set()
handlers = new Map()
signer: Nip01Signer
constructor(readonly opts: DVMOpts) {
this.signer = new Nip01Signer(opts.sk)
for (const [kind, createHandler] of Object.entries(this.opts.handlers)) {
this.handlers.set(parseInt(kind), createHandler(this))
}
@@ -35,7 +37,8 @@ export class DVM {
async start() {
this.active = true
const {sk, relays, context, requireMention = false} = this.opts
const {relays, context, requireMention = false} = this.opts
const pubkey = await this.signer.getPubkey()
while (this.active) {
await new Promise<void>(resolve => {
@@ -44,7 +47,7 @@ export class DVM {
const filter: Filter = {kinds, since}
if (requireMention) {
filter["#p"] = [getPublicKey(hexToBytes(sk))]
filter["#p"] = [pubkey]
}
const req = new MultiRequest({relays, filter, context})
@@ -109,8 +112,8 @@ export class DVM {
}
async publish(template: StampedEvent) {
const {sk, relays, context} = this.opts
const event = finalizeEvent(template, hexToBytes(sk))
const {relays, context} = this.opts
const event = await this.signer.sign(template)
await new Promise<void>(resolve => {
new MultiPublish({event, relays, context}).on(PublishEvent.Complete, resolve)
-1
View File
@@ -30,7 +30,6 @@
"@welshman/util": "^0.1.0",
"@welshman/relay": "^0.1.0",
"isomorphic-ws": "^5.0.0",
"nostr-tools": "^2.11.0",
"typed-emitter": "^2.1.0"
}
}
+1 -9
View File
@@ -1,5 +1,4 @@
import {EventEmitter} from "events"
import {verifyEvent as nostrToolsVerifyEvent} from "nostr-tools/pure"
import {on, call, randomId, yieldThread, pushToMapKey, batcher} from "@welshman/lib"
import {
Filter,
@@ -7,6 +6,7 @@ import {
matchFilter,
TrustedEvent,
getFilterResultCardinality,
verifyEvent as defaultVerifyEvent,
} from "@welshman/util"
import {RelayMessage, ClientMessageType, isRelayEvent, isRelayEose} from "./message.js"
import {getAdapter, AdapterContext, AbstractAdapter, AdapterEvent} from "./adapter.js"
@@ -14,14 +14,6 @@ import {SocketEvent, SocketStatus} from "./socket.js"
import {TypedEmitter, Unsubscriber} from "./util.js"
import {Tracker} from "./tracker.js"
export const defaultVerifyEvent = (event: any) => {
try {
return nostrToolsVerifyEvent(event)
} catch (e) {
return false
}
}
export enum RequestEvent {
Close = "request:event:close",
Disconnect = "request:event:disconnect",
+2 -1
View File
@@ -31,6 +31,7 @@
"dependencies": {
"@types/ws": "^8.5.13",
"@welshman/lib": "^0.1.0",
"nostr-tools": "^2.7.2"
"nostr-tools": "^2.7.2",
"nostr-wasm": "^0.1.0"
}
}
+18 -24
View File
@@ -1,5 +1,7 @@
import {verifiedSymbol, getEventHash, verifyEvent} from "nostr-tools/pure"
import {cached, mapVals, first, pick, now} from "@welshman/lib"
import {verifiedSymbol, verifyEvent as verifyEventPure} from "nostr-tools/pure"
import {setNostrWasm, verifyEvent as verifyEventWasm} from "nostr-tools/wasm"
import {initNostrWasm} from "nostr-wasm"
import {mapVals, first, pick, now} from "@welshman/lib"
import {getReplyTagValues, getCommentTagValues} from "./Tags.js"
import {getAddress, Address} from "./Address.js"
import {
@@ -59,6 +61,20 @@ export const makeEvent = (
export const createEvent = makeEvent
export const verifyEvent = (() => {
let verify = verifyEventPure
if (typeof WebAssembly === "object") {
initNostrWasm()
.then(setNostrWasm)
.then(() => {
verify = verifyEventWasm
})
}
return (event: TrustedEvent) => event.sig && verify(event as SignedEvent)
})()
export const isEventTemplate = (e: EventTemplate): e is EventTemplate =>
Boolean(typeof e.kind === "number" && Array.isArray(e.tags) && typeof e.content === "string")
@@ -100,28 +116,6 @@ export const asUnwrappedEvent = (e: UnwrappedEvent): UnwrappedEvent =>
export const asTrustedEvent = (e: TrustedEvent): TrustedEvent =>
pick(["kind", "tags", "content", "created_at", "pubkey", "id", "sig", "wrap"], e)
const _hasValidSignature = cached<string, boolean, [SignedEvent]>({
maxSize: 10000,
getKey: ([e]: [SignedEvent]) => {
try {
return `${getEventHash(e)}:${e.sig}`
} catch (err) {
return "invalid"
}
},
getValue: ([e]: [SignedEvent]) => {
try {
verifyEvent(e)
} catch (err) {
return false
}
return true
},
})
export const hasValidSignature = (e: SignedEvent) => e[verifiedSymbol] || _hasValidSignature(e)
export const getIdentifier = (e: EventTemplate) => e.tags.find(t => t[0] === "d")?.[1]
export const getIdOrAddress = (e: HashedEvent) => (isReplaceable(e) ? getAddress(e) : e.id)