file-handle.ts 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. /**
  2. * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. */
  6. import { defaults } from 'mol-util';
  7. export interface FileHandle {
  8. /** The number of bytes in the file */
  9. length: number
  10. /**
  11. * @param position The offset from the beginning of the file from which data should be read.
  12. * @param sizeOrBuffer The buffer the data will be written to. If a number a buffer of that size will be created.
  13. * @param size The number of bytes to read.
  14. * @param byteOffset The offset in the buffer at which to start writing.
  15. */
  16. readBuffer(position: number, sizeOrBuffer: Uint8Array | number, size?: number, byteOffset?: number): Promise<{ bytesRead: number, buffer: Uint8Array }>
  17. }
  18. export namespace FileHandle {
  19. export function fromBuffer(buffer: Uint8Array): FileHandle {
  20. return {
  21. length: buffer.length,
  22. readBuffer: (position: number, sizeOrBuffer: Uint8Array | number, size?: number, byteOffset?: number) => {
  23. if (typeof sizeOrBuffer === 'number') {
  24. const start = position
  25. const end = Math.min(buffer.length, start + (defaults(size, sizeOrBuffer)))
  26. return Promise.resolve({
  27. bytesRead: end - start,
  28. buffer: buffer.subarray(start, end),
  29. })
  30. } else {
  31. if (size === void 0) {
  32. return Promise.reject('readBuffer: Specify size.');
  33. }
  34. const start = position
  35. const end = Math.min(buffer.length, start + defaults(size, sizeOrBuffer.length))
  36. sizeOrBuffer.set(buffer.subarray(start, end), byteOffset)
  37. return Promise.resolve({
  38. bytesRead: end - start,
  39. buffer: sizeOrBuffer,
  40. })
  41. }
  42. }
  43. }
  44. }
  45. }