File size: 928 Bytes
9ae1216
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/**
 * @import {AsyncBuffer} from '../src/types.js'
 */

import { createReadStream, promises as fs } from 'fs'

export * from './index.js'

/**
 * Construct an AsyncBuffer for a local file using node fs package.
 *
 * @param {string} filename
 * @returns {Promise<AsyncBuffer>}
 */
export async function asyncBufferFromFile(filename) {
  const { size } = await fs.stat(filename)
  return {
    byteLength: size,
    slice(start, end) {
      // read file slice
      const reader = createReadStream(filename, { start, end })
      return new Promise((resolve, reject) => {
        /** @type {any[]} */
        const chunks = []
        reader.on('data', chunk => chunks.push(chunk))
        reader.on('error', reject)
        reader.on('end', () => {
          const buffer = Buffer.concat(chunks)
          resolve(buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength))
        })
      })
    },
  }
}