1- import { Event , ExpiringEvent } from '../@types/event'
1+ import { ContextMetadataKey , EventExpirationTimeMetadataKey } 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+ isValidRequestToVanishEvent ,
16+ } from '../utils/event'
17+ import { IEventRepository , IUserRepository } from '../@types/repositories'
418import { IEventStrategy , IMessageHandler } from '../@types/message-handlers'
5- import { ContextMetadataKey } from '../constants/base'
619import { createCommandResult } from '../utils/messages'
720import { createLogger } from '../factories/logger-factory'
8- import { EventExpirationTimeMetadataKey } from '../constants/base'
921import { Factory } from '../@types/base'
1022import { IncomingEventMessage } from '../@types/messages'
1123import { IRateLimiter } from '../@types/utils'
12- import { IUserRepository } from '../@types/repositories'
1324import { IWebSocketAdapter } from '../@types/adapters'
1425import { WebSocketAdapterEvent } from '../constants/adapter'
1526
@@ -19,6 +30,7 @@ export class EventMessageHandler implements IMessageHandler {
1930 public constructor (
2031 protected readonly webSocket : IWebSocketAdapter ,
2132 protected readonly strategyFactory : Factory < IEventStrategy < Event , Promise < void > > , [ Event , IWebSocketAdapter ] > ,
33+ protected readonly eventRepository : IEventRepository ,
2234 protected readonly userRepository : IUserRepository ,
2335 private readonly settings : ( ) => Settings ,
2436 private readonly slidingWindowRateLimiter : Factory < IRateLimiter > ,
@@ -57,6 +69,13 @@ export class EventMessageHandler implements IMessageHandler {
5769 return
5870 }
5971
72+ reason = await this . isBlockedByRequestToVanish ( event )
73+ if ( reason ) {
74+ debug ( 'event %s rejected: %s' , event . id , reason )
75+ this . webSocket . emit ( WebSocketAdapterEvent . Message , createCommandResult ( event . id , false , reason ) )
76+ return
77+ }
78+
6079 reason = await this . isUserAdmitted ( event )
6180 if ( reason ) {
6281 debug ( 'event %s rejected: %s' , event . id , reason )
@@ -190,6 +209,26 @@ export class EventMessageHandler implements IMessageHandler {
190209 if ( ! await isEventSignatureValid ( event ) ) {
191210 return 'invalid: event signature verification failed'
192211 }
212+
213+ if ( isRequestToVanishEvent ( event ) && ! isValidRequestToVanishEvent ( event , this . settings ( ) . info . relay_url ) ) {
214+ return 'invalid: request to vanish relay tag invalid'
215+ }
216+ }
217+
218+ protected async isBlockedByRequestToVanish ( event : Event ) : Promise < string | undefined > {
219+ if ( isRequestToVanishEvent ( event ) ) {
220+ return
221+ }
222+
223+ const relayPubkey = this . getRelayPublicKey ( )
224+ if ( relayPubkey === event . pubkey ) {
225+ return
226+ }
227+
228+ const existingVanishRequest = await this . eventRepository . hasActiveRequestToVanish ( event . pubkey )
229+ if ( existingVanishRequest ) {
230+ return 'blocked: request to vanish active for pubkey'
231+ }
193232 }
194233
195234 protected async isRateLimited ( event : Event ) : Promise < boolean > {
0 commit comments