@bsv/overlay-express
Version:
BSV Blockchain Overlay Express
92 lines (76 loc) • 3.5 kB
text/typescript
import * as DiscoveryServices from '@bsv/overlay-discovery-services'
import { BanService } from './BanService.js'
type SHIPStorage = InstanceType<typeof DiscoveryServices.SHIPStorage>
type SLAPStorage = InstanceType<typeof DiscoveryServices.SLAPStorage>
/**
* Prevents banned SHIP records from being written to discovery storage.
*/
export class BanAwareSHIPStorage {
constructor (
private readonly wrapped: SHIPStorage,
private readonly banService: BanService,
private readonly logger: typeof console = console
) {}
async ensureIndexes (): Promise<void> {
return await this.wrapped.ensureIndexes()
}
async hasDuplicateRecord (identityKey: string, domain: string, topic: string): Promise<boolean> {
return await this.wrapped.hasDuplicateRecord(identityKey, domain, topic)
}
async storeSHIPRecord (txid: string, outputIndex: number, identityKey: string, domain: string, topic: string): Promise<void> {
if (await this.banService.isOutpointBanned(txid, outputIndex)) {
this.logger.log(`[BAN] Blocked banned outpoint ${txid}.${outputIndex} from SHIP storage`)
return
}
if (await this.banService.isDomainBanned(domain)) {
this.logger.log(`[BAN] Blocked banned domain ${domain} from SHIP storage (${txid}.${outputIndex})`)
return
}
return await this.wrapped.storeSHIPRecord(txid, outputIndex, identityKey, domain, topic)
}
async deleteSHIPRecord (txid: string, outputIndex: number): Promise<void> {
return await this.wrapped.deleteSHIPRecord(txid, outputIndex)
}
async findRecord (...args: Parameters<SHIPStorage['findRecord']>): ReturnType<SHIPStorage['findRecord']> {
return await this.wrapped.findRecord(...args)
}
async findAll (...args: Parameters<SHIPStorage['findAll']>): ReturnType<SHIPStorage['findAll']> {
return await this.wrapped.findAll(...args)
}
}
/**
* Prevents banned SLAP records from being written to discovery storage.
*/
export class BanAwareSLAPStorage {
constructor (
private readonly wrapped: SLAPStorage,
private readonly banService: BanService,
private readonly logger: typeof console = console
) {}
async ensureIndexes (): Promise<void> {
return await this.wrapped.ensureIndexes()
}
async hasDuplicateRecord (identityKey: string, domain: string, service: string): Promise<boolean> {
return await this.wrapped.hasDuplicateRecord(identityKey, domain, service)
}
async storeSLAPRecord (txid: string, outputIndex: number, identityKey: string, domain: string, service: string): Promise<void> {
if (await this.banService.isOutpointBanned(txid, outputIndex)) {
this.logger.log(`[BAN] Blocked banned outpoint ${txid}.${outputIndex} from SLAP storage`)
return
}
if (await this.banService.isDomainBanned(domain)) {
this.logger.log(`[BAN] Blocked banned domain ${domain} from SLAP storage (${txid}.${outputIndex})`)
return
}
return await this.wrapped.storeSLAPRecord(txid, outputIndex, identityKey, domain, service)
}
async deleteSLAPRecord (txid: string, outputIndex: number): Promise<void> {
return await this.wrapped.deleteSLAPRecord(txid, outputIndex)
}
async findRecord (...args: Parameters<SLAPStorage['findRecord']>): ReturnType<SLAPStorage['findRecord']> {
return await this.wrapped.findRecord(...args)
}
async findAll (...args: Parameters<SLAPStorage['findAll']>): ReturnType<SLAPStorage['findAll']> {
return await this.wrapped.findAll(...args)
}
}