file-handle.ts 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. /**
  2. * Copyright (c) 2018-2021 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. * @author David Sehnal <david.sehnal@gmail.com>
  6. */
  7. import * as fs from 'fs';
  8. import { FileHandle } from '../../mol-io/common/file-handle';
  9. import { SimpleBuffer } from '../../mol-io/common/simple-buffer';
  10. import { defaults, noop } from '../../mol-util';
  11. export function fileHandleFromDescriptor(file: number, name: string): FileHandle {
  12. if (fs === undefined) throw new Error('fs module not available');
  13. return {
  14. name,
  15. readBuffer: (position: number, sizeOrBuffer: SimpleBuffer | number, length?: number, byteOffset?: number) => {
  16. return new Promise((res, rej) => {
  17. let outBuffer: SimpleBuffer;
  18. if (typeof sizeOrBuffer === 'number') {
  19. byteOffset = defaults(byteOffset, 0);
  20. length = defaults(length, sizeOrBuffer);
  21. outBuffer = SimpleBuffer.fromArrayBuffer(new ArrayBuffer(sizeOrBuffer));
  22. } else {
  23. byteOffset = defaults(byteOffset, 0);
  24. length = defaults(length, sizeOrBuffer.length);
  25. outBuffer = sizeOrBuffer;
  26. }
  27. fs.read(file, outBuffer, byteOffset, length, position, (err, bytesRead, buffer) => {
  28. if (err) {
  29. rej(err);
  30. return;
  31. }
  32. if (length !== bytesRead) {
  33. console.warn(`byteCount ${length} and bytesRead ${bytesRead} differ`);
  34. }
  35. res({ bytesRead, buffer });
  36. });
  37. });
  38. },
  39. writeBuffer: (position: number, buffer: SimpleBuffer, length?: number) => {
  40. length = defaults(length, buffer.length);
  41. return new Promise<number>((res, rej) => {
  42. fs.write(file, buffer, 0, length, position, (err, written) => {
  43. if (err) rej(err);
  44. else res(written);
  45. });
  46. });
  47. },
  48. writeBufferSync: (position: number, buffer: Uint8Array, length?: number) => {
  49. length = defaults(length, buffer.length);
  50. return fs.writeSync(file, buffer, 0, length, position);
  51. },
  52. close: () => {
  53. try {
  54. if (file !== void 0) fs.close(file, noop);
  55. } catch (e) {
  56. }
  57. }
  58. };
  59. }