From 3ce15d78ec77dce8195f79a4869f01f502bafa5d Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Wed, 6 Mar 2024 11:47:50 -0600 Subject: [PATCH] Fix (most) slow types by adding explicit return types --- abstract-pool.ts | 4 ++-- abstract-relay.ts | 6 +++--- kinds.ts | 8 ++++---- nip11.ts | 4 ++-- nip21.ts | 2 +- nip27.ts | 2 +- nip30.ts | 2 +- nip44.ts | 10 +++++----- nip47.ts | 16 +++++++++++++--- pure.ts | 2 +- relay.ts | 2 +- utils.ts | 8 ++++---- 12 files changed, 38 insertions(+), 28 deletions(-) diff --git a/abstract-pool.ts b/abstract-pool.ts index d37ceea9..2021c987 100644 --- a/abstract-pool.ts +++ b/abstract-pool.ts @@ -15,11 +15,11 @@ export type SubscribeManyParams = Omit & { export class AbstractSimplePool { private relays = new Map() - public seenOn = new Map>() + public seenOn: Map> = new Map() public trackRelays: boolean = false public verifyEvent: Nostr['verifyEvent'] - public trustedRelayURLs = new Set() + public trustedRelayURLs: Set = new Set() constructor(opts: { verifyEvent: Nostr['verifyEvent'] }) { this.verifyEvent = opts.verifyEvent diff --git a/abstract-relay.ts b/abstract-relay.ts index 8277eec7..e0445bd8 100644 --- a/abstract-relay.ts +++ b/abstract-relay.ts @@ -26,7 +26,7 @@ export class AbstractRelay { public baseEoseTimeout: number = 4400 public connectionTimeout: number = 4400 - public openSubs = new Map() + public openSubs: Map = new Map() private connectionTimeoutHandle: ReturnType | undefined private connectionPromise: Promise | undefined @@ -44,7 +44,7 @@ export class AbstractRelay { this.verifyEvent = opts.verifyEvent } - static async connect(url: string, opts: { verifyEvent: Nostr['verifyEvent'] }) { + static async connect(url: string, opts: { verifyEvent: Nostr['verifyEvent'] }): Promise { const relay = new AbstractRelay(url, opts) await relay.connect() return relay @@ -228,7 +228,7 @@ export class AbstractRelay { }) } - public async auth(signAuthEvent: (evt: EventTemplate) => Promise) { + public async auth(signAuthEvent: (evt: EventTemplate) => Promise): Promise { if (!this.challenge) throw new Error("can't perform auth, no challenge was received") const evt = await signAuthEvent(makeAuthEvent(this.url, this.challenge)) const ret = new Promise((resolve, reject) => { diff --git a/kinds.ts b/kinds.ts index 85944008..b6de6a82 100644 --- a/kinds.ts +++ b/kinds.ts @@ -1,20 +1,20 @@ /** Events are **regular**, which means they're all expected to be stored by relays. */ -export function isRegularKind(kind: number) { +export function isRegularKind(kind: number): boolean { return (1000 <= kind && kind < 10000) || [1, 2, 4, 5, 6, 7, 8, 16, 40, 41, 42, 43, 44].includes(kind) } /** Events are **replaceable**, which means that, for each combination of `pubkey` and `kind`, only the latest event is expected to (SHOULD) be stored by relays, older versions are expected to be discarded. */ -export function isReplaceableKind(kind: number) { +export function isReplaceableKind(kind: number): boolean { return [0, 3].includes(kind) || (10000 <= kind && kind < 20000) } /** Events are **ephemeral**, which means they are not expected to be stored by relays. */ -export function isEphemeralKind(kind: number) { +export function isEphemeralKind(kind: number): boolean { return 20000 <= kind && kind < 30000 } /** Events are **parameterized replaceable**, which means that, for each combination of `pubkey`, `kind` and the `d` tag, only the latest event is expected to be stored by relays, older versions are expected to be discarded. */ -export function isParameterizedReplaceableKind(kind: number) { +export function isParameterizedReplaceableKind(kind: number): boolean { return 30000 <= kind && kind < 40000 } diff --git a/nip11.ts b/nip11.ts index e8551113..55a86d6d 100644 --- a/nip11.ts +++ b/nip11.ts @@ -4,11 +4,11 @@ try { _fetch = fetch } catch {} -export function useFetchImplementation(fetchImplementation: any) { +export function useFetchImplementation(fetchImplementation: any): void { _fetch = fetchImplementation } -export async function fetchRelayInformation(url: string) { +export async function fetchRelayInformation(url: string): Promise { return (await ( await fetch(url.replace('ws://', 'http://').replace('wss://', 'https://'), { headers: { Accept: 'application/nostr+json' }, diff --git a/nip21.ts b/nip21.ts index 3bb02800..63e04648 100644 --- a/nip21.ts +++ b/nip21.ts @@ -1,7 +1,7 @@ import { BECH32_REGEX, decode, type DecodeResult } from './nip19.ts' /** Nostr URI regex, eg `nostr:npub1...` */ -export const NOSTR_URI_REGEX = new RegExp(`nostr:(${BECH32_REGEX.source})`) +export const NOSTR_URI_REGEX: RegExp = new RegExp(`nostr:(${BECH32_REGEX.source})`) /** Test whether the value is a Nostr URI. */ export function test(value: unknown): value is `nostr:${string}` { diff --git a/nip27.ts b/nip27.ts index c63804b5..d45224cc 100644 --- a/nip27.ts +++ b/nip27.ts @@ -2,7 +2,7 @@ import { decode } from './nip19.ts' import { NOSTR_URI_REGEX, type NostrURI } from './nip21.ts' /** Regex to find NIP-21 URIs inside event content. */ -export const regex = () => new RegExp(`\\b${NOSTR_URI_REGEX.source}\\b`, 'g') +export const regex = (): RegExp => new RegExp(`\\b${NOSTR_URI_REGEX.source}\\b`, 'g') /** Match result for a Nostr URI in event content. */ export interface NostrURIMatch extends NostrURI { diff --git a/nip30.ts b/nip30.ts index 9030c736..31257ff4 100644 --- a/nip30.ts +++ b/nip30.ts @@ -2,7 +2,7 @@ export const EMOJI_SHORTCODE_REGEX = /:(\w+):/ /** Regex to find emoji shortcodes in content. */ -export const regex = () => new RegExp(`\\B${EMOJI_SHORTCODE_REGEX.source}\\B`, 'g') +export const regex = (): RegExp => new RegExp(`\\B${EMOJI_SHORTCODE_REGEX.source}\\B`, 'g') /** Represents a Nostr custom emoji. */ export interface CustomEmoji { diff --git a/nip44.ts b/nip44.ts index 994a0758..b770fc3d 100644 --- a/nip44.ts +++ b/nip44.ts @@ -13,7 +13,7 @@ const u = { maxPlaintextSize: 0xffff, // 65535 (64kb-1) => padded to 64kb utf8Encode: utf8ToBytes, - utf8Decode(bytes: Uint8Array) { + utf8Decode(bytes: Uint8Array): string { return decoder.decode(bytes) }, @@ -39,7 +39,7 @@ const u = { return chunk * (Math.floor((len - 1) / chunk) + 1) }, - writeU16BE(num: number) { + writeU16BE(num: number): Uint8Array { if (!Number.isSafeInteger(num) || num < u.minPlaintextSize || num > u.maxPlaintextSize) throw new Error('invalid plaintext size: must be between 1 and 65535 bytes') const arr = new Uint8Array(2) @@ -68,7 +68,7 @@ const u = { return u.utf8Decode(unpadded) }, - hmacAad(key: Uint8Array, message: Uint8Array, aad: Uint8Array) { + hmacAad(key: Uint8Array, message: Uint8Array, aad: Uint8Array): Uint8Array { if (aad.length !== 32) throw new Error('AAD associated data must be 32 bytes') const combined = concatBytes(aad, message) return hmac(sha256, key, combined) @@ -80,7 +80,7 @@ const u = { // ciphertext: 32b+2 to 0xffff+2 // raw payload: 99 (65+32+2) to 65603 (65+0xffff+2) // compressed payload (base64): 132b to 87472b - decodePayload(payload: string) { + decodePayload(payload: string): { nonce: Uint8Array; ciphertext: Uint8Array; mac: Uint8Array } { if (typeof payload !== 'string') throw new Error('payload must be a valid string') const plen = payload.length if (plen < 132 || plen > 87472) throw new Error('invalid payload length: ' + plen) @@ -103,7 +103,7 @@ const u = { }, } -function encrypt(plaintext: string, conversationKey: Uint8Array, nonce = randomBytes(32)): string { +function encrypt(plaintext: string, conversationKey: Uint8Array, nonce: Uint8Array = randomBytes(32)): string { const { chacha_key, chacha_nonce, hmac_key } = u.getMessageKeys(conversationKey, nonce) const padded = u.pad(plaintext) const ciphertext = chacha20(chacha_key, chacha_nonce, padded) diff --git a/nip47.ts b/nip47.ts index cab1b1b3..6d34e1d3 100644 --- a/nip47.ts +++ b/nip47.ts @@ -1,8 +1,14 @@ -import { finalizeEvent } from './pure.ts' +import { type VerifiedEvent, finalizeEvent } from './pure.ts' import { NWCWalletRequest } from './kinds.ts' import { encrypt } from './nip04.ts' -export function parseConnectionString(connectionString: string) { +interface NWCConnection { + pubkey: string + relay: string + secret: string +} + +export function parseConnectionString(connectionString: string): NWCConnection { const { pathname, searchParams } = new URL(connectionString) const pubkey = pathname const relay = searchParams.get('relay') @@ -15,7 +21,11 @@ export function parseConnectionString(connectionString: string) { return { pubkey, relay, secret } } -export async function makeNwcRequestEvent(pubkey: string, secretKey: Uint8Array, invoice: string) { +export async function makeNwcRequestEvent( + pubkey: string, + secretKey: Uint8Array, + invoice: string, +): Promise { const content = { method: 'pay_invoice', params: { diff --git a/pure.ts b/pure.ts index c9e5912d..ca192f0e 100644 --- a/pure.ts +++ b/pure.ts @@ -50,7 +50,7 @@ export function getEventHash(event: UnsignedEvent): string { return bytesToHex(eventHash) } -const i = new JS() +const i: JS = new JS() export const generateSecretKey = i.generateSecretKey export const getPublicKey = i.getPublicKey diff --git a/relay.ts b/relay.ts index cc15d755..acdb6780 100644 --- a/relay.ts +++ b/relay.ts @@ -13,7 +13,7 @@ export class Relay extends AbstractRelay { super(url, { verifyEvent }) } - static async connect(url: string) { + static async connect(url: string): Promise { const relay = new Relay(url) await relay.connect() return relay diff --git a/utils.ts b/utils.ts index 2e40643d..70ed6640 100644 --- a/utils.ts +++ b/utils.ts @@ -1,7 +1,7 @@ import type { Event } from './core.ts' -export const utf8Decoder = new TextDecoder('utf-8') -export const utf8Encoder = new TextEncoder() +export const utf8Decoder: TextDecoder = new TextDecoder('utf-8') +export const utf8Encoder: TextEncoder = new TextEncoder() export function normalizeURL(url: string): string { if (url.indexOf('://') === -1) url = 'wss://' + url @@ -14,7 +14,7 @@ export function normalizeURL(url: string): string { return p.toString() } -export function insertEventIntoDescendingList(sortedArray: Event[], event: Event) { +export function insertEventIntoDescendingList(sortedArray: Event[], event: Event): Event[] { const [idx, found] = binarySearch(sortedArray, b => { if (event.id === b.id) return 0 if (event.created_at === b.created_at) return -1 @@ -26,7 +26,7 @@ export function insertEventIntoDescendingList(sortedArray: Event[], event: Event return sortedArray } -export function insertEventIntoAscendingList(sortedArray: Event[], event: Event) { +export function insertEventIntoAscendingList(sortedArray: Event[], event: Event): Event[] { const [idx, found] = binarySearch(sortedArray, b => { if (event.id === b.id) return 0 if (event.created_at === b.created_at) return -1