hyparquet-writer/src/filewriter.js

50 lines
1.3 KiB
JavaScript
Raw Normal View History

2025-04-08 10:22:30 +00:00
import fs from 'fs'
import { ByteWriter } from './bytewriter.js'
/**
* Buffered file writer.
* Writes data to a local file in chunks using node fs.
*
* @import {Writer} from '../src/types.js'
* @param {string} filename
* @returns {Writer}
*/
export function fileWriter(filename) {
const writer = new ByteWriter()
const chunkSize = 1_000_000 // 1mb
// create a new file or overwrite existing one
fs.writeFileSync(filename, '', { flag: 'w' })
function flush() {
const chunk = writer.buffer.slice(0, writer.offset)
// TODO: async
fs.writeFileSync(filename, new Uint8Array(chunk), { flag: 'a' })
writer.offset = 0
}
/**
* Override the ensure method
* @param {number} size
*/
writer.ensure = function(size) {
if (writer.offset > chunkSize) {
flush()
}
if (writer.offset + size > writer.buffer.byteLength) {
const newSize = Math.max(writer.buffer.byteLength * 2, writer.offset + size)
const newBuffer = new ArrayBuffer(newSize)
new Uint8Array(newBuffer).set(new Uint8Array(writer.buffer))
writer.buffer = newBuffer
writer.view = new DataView(writer.buffer)
}
}
writer.getBuffer = function () {
throw new Error('getBuffer not supported for FileWriter')
}
writer.finish = function() {
flush()
}
return writer
}