1- import { Event , ExpiringEvent } from '../@types/event'
1+ import { ContextMetadataKey , EventExpirationTimeMetadataKey , EventKinds } from '../constants/base'
2+ import { Event , ExpiringEvent } from '../@types/event'
23import { EventRateLimit , FeeSchedule , Settings } from '../@types/settings'
3- import { getEventExpiration , getEventProofOfWork , getPubkeyProofOfWork , getPublicKey , getRelayPrivateKey , isEventIdValid , isEventKindOrRangeMatch , isEventSignatureValid , isExpiredEvent } from '../utils/event'
4+ import {
5+ getEventExpiration ,
6+ getEventProofOfWork ,
7+ getPubkeyProofOfWork ,
8+ getPublicKey ,
9+ getRelayPrivateKey ,
10+ isEventIdValid ,
11+ isEventKindOrRangeMatch ,
12+ isEventSignatureValid ,
13+ isExpiredEvent ,
14+ isRequestToVanishEvent ,
15+ } from '../utils/event'
16+ import { IEventRepository , IUserRepository } from '../@types/repositories'
417import { IEventStrategy , IMessageHandler } from '../@types/message-handlers'
5- import { ContextMetadataKey } from '../constants/base'
618import { createCommandResult } from '../utils/messages'
719import { createLogger } from '../factories/logger-factory'
8- import { EventExpirationTimeMetadataKey } from '../constants/base'
920import { Factory } from '../@types/base'
1021import { IncomingEventMessage } from '../@types/messages'
1122import { IRateLimiter } from '../@types/utils'
12- import { IUserRepository } from '../@types/repositories'
1323import { IWebSocketAdapter } from '../@types/adapters'
1424import { WebSocketAdapterEvent } from '../constants/adapter'
1525
@@ -19,6 +29,7 @@ export class EventMessageHandler implements IMessageHandler {
1929 public constructor (
2030 protected readonly webSocket : IWebSocketAdapter ,
2131 protected readonly strategyFactory : Factory < IEventStrategy < Event , Promise < void > > , [ Event , IWebSocketAdapter ] > ,
32+ protected readonly eventRepository : IEventRepository ,
2233 protected readonly userRepository : IUserRepository ,
2334 private readonly settings : ( ) => Settings ,
2435 private readonly slidingWindowRateLimiter : Factory < IRateLimiter > ,
@@ -57,6 +68,13 @@ export class EventMessageHandler implements IMessageHandler {
5768 return
5869 }
5970
71+ reason = await this . isBlockedByRequestToVanish ( event )
72+ if ( reason ) {
73+ debug ( 'event %s rejected: %s' , event . id , reason )
74+ this . webSocket . emit ( WebSocketAdapterEvent . Message , createCommandResult ( event . id , false , reason ) )
75+ return
76+ }
77+
6078 reason = await this . isUserAdmitted ( event )
6179 if ( reason ) {
6280 debug ( 'event %s rejected: %s' , event . id , reason )
@@ -190,6 +208,26 @@ export class EventMessageHandler implements IMessageHandler {
190208 if ( ! await isEventSignatureValid ( event ) ) {
191209 return 'invalid: event signature verification failed'
192210 }
211+
212+ if ( event . kind === EventKinds . REQUEST_TO_VANISH && ! isRequestToVanishEvent ( event , this . settings ( ) . info . relay_url ) ) {
213+ return 'invalid: request to vanish relay tag invalid'
214+ }
215+ }
216+
217+ protected async isBlockedByRequestToVanish ( event : Event ) : Promise < string | undefined > {
218+ if ( isRequestToVanishEvent ( event ) ) {
219+ return
220+ }
221+
222+ const relayPubkey = this . getRelayPublicKey ( )
223+ if ( relayPubkey === event . pubkey ) {
224+ return
225+ }
226+
227+ const existingVanishRequest = await this . eventRepository . hasActiveRequestToVanish ( event . pubkey )
228+ if ( existingVanishRequest ) {
229+ return 'blocked: request to vanish active for pubkey'
230+ }
193231 }
194232
195233 protected async isRateLimited ( event : Event ) : Promise < boolean > {
0 commit comments