feat: add "strictNullChecks"

This commit is contained in:
Adhiraj Singh
2022-07-08 10:38:25 +05:30
parent 7426b7aa2f
commit 40a1e268aa
42 changed files with 350 additions and 339 deletions

View File

@@ -62,7 +62,11 @@ export const hkdfInfoKey = (type: MediaType) => {
}
/** generates all the keys required to encrypt/decrypt & sign a media message */
export function getMediaKeys(buffer: Uint8Array | string, mediaType: MediaType): MediaDecryptionKeyInfo {
export function getMediaKeys(buffer: Uint8Array | string | null | undefined, mediaType: MediaType): MediaDecryptionKeyInfo {
if(!buffer) {
throw new Boom('Cannot derive from empty media key')
}
if(typeof buffer === 'string') {
buffer = Buffer.from(buffer.replace('data:;base64,', ''), 'base64')
}
@@ -163,13 +167,13 @@ export async function getAudioDuration(buffer: Buffer | string | Readable) {
const musicMetadata = await import('music-metadata')
let metadata: IAudioMetadata
if(Buffer.isBuffer(buffer)) {
metadata = await musicMetadata.parseBuffer(buffer, null, { duration: true })
metadata = await musicMetadata.parseBuffer(buffer, undefined, { duration: true })
} else if(typeof buffer === 'string') {
const rStream = createReadStream(buffer)
metadata = await musicMetadata.parseStream(rStream, null, { duration: true })
metadata = await musicMetadata.parseStream(rStream, undefined, { duration: true })
rStream.close()
} else {
metadata = await musicMetadata.parseStream(buffer, null, { duration: true })
metadata = await musicMetadata.parseStream(buffer, undefined, { duration: true })
}
return metadata.format.duration
@@ -216,7 +220,7 @@ export async function generateThumbnail(
logger?: Logger
}
) {
let thumbnail: string
let thumbnail: string | undefined
if(mediaType === 'image') {
const buff = await extractImageThumb(file)
thumbnail = buff.toString('base64')
@@ -259,8 +263,8 @@ export const encryptedStream = async(
// const encWriteStream = createWriteStream(encBodyPath)
const encWriteStream = new Readable({ read: () => {} })
let bodyPath: string
let writeStream: WriteStream
let bodyPath: string | undefined
let writeStream: WriteStream | undefined
let didSaveToTmpPath = false
if(type === 'file') {
bodyPath = (media as any).url
@@ -272,7 +276,7 @@ export const encryptedStream = async(
let fileLength = 0
const aes = Crypto.createCipheriv('aes-256-cbc', cipherKey, iv)
let hmac = Crypto.createHmac('sha256', macKey).update(iv)
let hmac = Crypto.createHmac('sha256', macKey!).update(iv)
let sha256Plain = Crypto.createHash('sha256')
let sha256Enc = Crypto.createHash('sha256')
@@ -323,7 +327,7 @@ export const encryptedStream = async(
}
} catch(error) {
encWriteStream.destroy(error)
writeStream.destroy(error)
writeStream?.destroy(error)
aes.destroy(error)
hmac.destroy(error)
sha256Plain.destroy(error)
@@ -353,7 +357,7 @@ export const downloadContentFromMessage = (
type: MediaType,
opts: MediaDownloadOptions = { }
) => {
const downloadUrl = url || getUrlFromDirectPath(directPath)
const downloadUrl = url || getUrlFromDirectPath(directPath!)
const keys = getMediaKeys(mediaKey, type)
return downloadEncryptedContent(downloadUrl, keys, opts)
@@ -410,8 +414,8 @@ export const downloadEncryptedContent = async(
const pushBytes = (bytes: Buffer, push: (bytes: Buffer) => void) => {
if(startByte || endByte) {
const start = bytesFetched >= startByte ? undefined : Math.max(startByte - bytesFetched, 0)
const end = bytesFetched + bytes.length < endByte ? undefined : Math.max(endByte - bytesFetched, 0)
const start = bytesFetched >= startByte! ? undefined : Math.max(startByte! - bytesFetched, 0)
const end = bytesFetched + bytes.length < endByte! ? undefined : Math.max(endByte! - bytesFetched, 0)
push(bytes.slice(start, end))
@@ -486,13 +490,13 @@ export function extensionForMediaMessage(message: WAMessageContent) {
return extension
}
export const getWAUploadToServer = ({ customUploadHosts, fetchAgent, logger }: CommonSocketConfig<any>, refreshMediaConn: (force: boolean) => Promise<MediaConnInfo>): WAMediaUploadFunction => {
export const getWAUploadToServer = ({ customUploadHosts, fetchAgent, logger }: CommonSocketConfig, refreshMediaConn: (force: boolean) => Promise<MediaConnInfo>): WAMediaUploadFunction => {
return async(stream, { mediaType, fileEncSha256B64, timeoutMs }) => {
const { default: axios } = await import('axios')
// send a query JSON to obtain the url & auth token to upload our media
let uploadInfo = await refreshMediaConn(false)
let urls: { mediaUrl: string, directPath: string }
let urls: { mediaUrl: string, directPath: string } | undefined
const hosts = [ ...customUploadHosts, ...uploadInfo.hosts ]
const chunks: Buffer[] = []
@@ -500,7 +504,7 @@ export const getWAUploadToServer = ({ customUploadHosts, fetchAgent, logger }: C
chunks.push(chunk)
}
let reqBody = Buffer.concat(chunks)
const reqBody = Buffer.concat(chunks)
for(const { hostname, maxContentLengthBytes } of hosts) {
logger.debug(`uploading to "${hostname}"`)
@@ -550,9 +554,6 @@ export const getWAUploadToServer = ({ customUploadHosts, fetchAgent, logger }: C
}
}
// clear buffer just to be sure we're releasing the memory
reqBody = undefined
if(!urls) {
throw new Boom(
'Media upload failed on all hosts',
@@ -583,12 +584,12 @@ export const encryptMediaRetryRequest = (
const iv = Crypto.randomBytes(12)
const retryKey = getMediaRetryKey(mediaKey)
const ciphertext = aesEncryptGCM(recpBuffer, retryKey, iv, Buffer.from(key.id))
const ciphertext = aesEncryptGCM(recpBuffer, retryKey, iv, Buffer.from(key.id!))
const req: BinaryNode = {
tag: 'receipt',
attrs: {
id: key.id,
id: key.id!,
to: jidNormalizedUser(meId),
type: 'server-error'
},
@@ -607,8 +608,9 @@ export const encryptMediaRetryRequest = (
{
tag: 'rmr',
attrs: {
jid: key.remoteJid,
jid: key.remoteJid!,
from_me: (!!key.fromMe).toString(),
// @ts-ignore
participant: key.participant || undefined
}
}
@@ -619,7 +621,7 @@ export const encryptMediaRetryRequest = (
}
export const decodeMediaRetryNode = (node: BinaryNode) => {
const rmrNode = getBinaryNodeChild(node, 'rmr')
const rmrNode = getBinaryNodeChild(node, 'rmr')!
const event: BaileysEventMap<any>['messages.media-update'][number] = {
key: {