mirror of
https://github.com/asadbek064/hyparquet-writer.git
synced 2025-12-05 23:31:54 +00:00
50 lines
1.3 KiB
JavaScript
50 lines
1.3 KiB
JavaScript
|
|
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
|
||
|
|
}
|