export function readEncryptionDetails()

in runtimes/runtimes/auth/standalone/encryption.ts [49:88]


export function readEncryptionDetails(stream: Readable): Promise<EncryptionInitialization> {
    return new Promise<EncryptionInitialization>((resolve, reject) => {
        let buffer = Buffer.alloc(0)
        const TIMEOUT_INTERVAL_MS = 5000

        const timer: NodeJS.Timeout = setTimeout(() => {
            clearTimer()
            stream.removeListener('readable', onStreamIsReadable)
            reject(`Encryption details followed by newline must be sent during first ${TIMEOUT_INTERVAL_MS}ms`)
        }, TIMEOUT_INTERVAL_MS)

        const clearTimer = () => {
            if (timer) {
                clearTimeout(timer)
            }
        }

        // Fires when the stream has contents that can be read
        const onStreamIsReadable = () => {
            let byteRead
            while ((byteRead = stream.read(1)) !== null) {
                if (byteRead.toString('utf-8') == '\n') {
                    clearTimer()
                    // Stop reading this stream, we have read a line from it
                    stream.removeListener('readable', onStreamIsReadable)
                    try {
                        resolve(JSON.parse(buffer.toString('utf-8')) as EncryptionInitialization)
                    } catch (error) {
                        reject(error)
                    }
                    break
                } else {
                    buffer = Buffer.concat([buffer, byteRead])
                }
            }
        }

        stream.on('readable', onStreamIsReadable)
    })
}