UNPKG

apache-arrow

Version:
128 lines (126 loc) 5.23 kB
// Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. import { __awaiter } from "tslib"; import { ByteStream, AsyncByteStream } from './stream.mjs'; import { toUint8Array } from '../util/buffer.mjs'; /** @ignore */ export class RandomAccessFile extends ByteStream { constructor(buffer, byteLength) { super(); this.position = 0; this.buffer = toUint8Array(buffer); this.size = typeof byteLength === 'undefined' ? this.buffer.byteLength : byteLength; } readInt32(position) { const { buffer, byteOffset } = this.readAt(position, 4); return new DataView(buffer, byteOffset).getInt32(0, true); } seek(position) { this.position = Math.min(position, this.size); return position < this.size; } read(nBytes) { const { buffer, size, position } = this; if (buffer && position < size) { if (typeof nBytes !== 'number') { nBytes = Number.POSITIVE_INFINITY; } this.position = Math.min(size, position + Math.min(size - position, nBytes)); return buffer.subarray(position, this.position); } return null; } readAt(position, nBytes) { const buf = this.buffer; const end = Math.min(this.size, position + nBytes); return buf ? buf.subarray(position, end) : new Uint8Array(nBytes); } close() { this.buffer && (this.buffer = null); } throw(value) { this.close(); return { done: true, value }; } return(value) { this.close(); return { done: true, value }; } } /** @ignore */ export class AsyncRandomAccessFile extends AsyncByteStream { constructor(file, byteLength) { super(); this.position = 0; this._handle = file; if (typeof byteLength === 'number') { this.size = byteLength; } else { this._pending = (() => __awaiter(this, void 0, void 0, function* () { this.size = (yield file.stat()).size; delete this._pending; }))(); } } readInt32(position) { return __awaiter(this, void 0, void 0, function* () { const { buffer, byteOffset } = yield this.readAt(position, 4); return new DataView(buffer, byteOffset).getInt32(0, true); }); } seek(position) { return __awaiter(this, void 0, void 0, function* () { this._pending && (yield this._pending); this.position = Math.min(position, this.size); return position < this.size; }); } read(nBytes) { return __awaiter(this, void 0, void 0, function* () { this._pending && (yield this._pending); const { _handle: file, size, position } = this; if (file && position < size) { if (typeof nBytes !== 'number') { nBytes = Number.POSITIVE_INFINITY; } let pos = position, offset = 0, bytesRead = 0; const end = Math.min(size, pos + Math.min(size - pos, nBytes)); const buffer = new Uint8Array(Math.max(0, (this.position = end) - pos)); while ((pos += bytesRead) < end && (offset += bytesRead) < buffer.byteLength) { ({ bytesRead } = yield file.read(buffer, offset, buffer.byteLength - offset, pos)); } return buffer; } return null; }); } readAt(position, nBytes) { return __awaiter(this, void 0, void 0, function* () { this._pending && (yield this._pending); const { _handle: file, size } = this; if (file && (position + nBytes) < size) { const end = Math.min(size, position + nBytes); const buffer = new Uint8Array(end - position); return (yield file.read(buffer, 0, nBytes, position)).buffer; } return new Uint8Array(nBytes); }); } close() { return __awaiter(this, void 0, void 0, function* () { const f = this._handle; this._handle = null; f && (yield f.close()); }); } throw(value) { return __awaiter(this, void 0, void 0, function* () { yield this.close(); return { done: true, value }; }); } return(value) { return __awaiter(this, void 0, void 0, function* () { yield this.close(); return { done: true, value }; }); } } //# sourceMappingURL=file.mjs.map