Browse Source

Move FileHandle.fromDescriptor to /servers to avoid importing 'fs' in browser builds

dsehnal 3 years ago
parent
commit
45ef00f1d1

+ 0 - 53
src/mol-io/common/file-handle.ts

@@ -7,8 +7,6 @@
 
 import { defaults, noop } from '../../mol-util';
 import { SimpleBuffer } from './simple-buffer';
-// only import 'fs' in node.js
-const fs = typeof document === 'undefined' ? require('fs') as typeof import('fs') : void 0;
 
 export interface FileHandle {
     name: string
@@ -83,55 +81,4 @@ export namespace FileHandle {
             close: noop
         };
     }
-
-    export function fromDescriptor(file: number, name: string): FileHandle {
-        if (fs === undefined) throw new Error('fs module not available');
-        return {
-            name,
-            readBuffer: (position: number, sizeOrBuffer: SimpleBuffer | number, length?: number, byteOffset?: number) => {
-                return new Promise((res, rej) => {
-                    let outBuffer: SimpleBuffer;
-                    if (typeof sizeOrBuffer === 'number') {
-                        byteOffset = defaults(byteOffset, 0);
-                        length = defaults(length, sizeOrBuffer);
-                        outBuffer = SimpleBuffer.fromArrayBuffer(new ArrayBuffer(sizeOrBuffer));
-                    } else {
-                        byteOffset = defaults(byteOffset, 0);
-                        length = defaults(length, sizeOrBuffer.length);
-                        outBuffer = sizeOrBuffer;
-                    }
-                    fs.read(file, outBuffer, byteOffset, length, position, (err, bytesRead, buffer) => {
-                        if (err) {
-                            rej(err);
-                            return;
-                        }
-                        if (length !== bytesRead) {
-                            console.warn(`byteCount ${length} and bytesRead ${bytesRead} differ`);
-                        }
-                        res({ bytesRead, buffer });
-                    });
-                });
-            },
-            writeBuffer: (position: number, buffer: SimpleBuffer, length?: number) => {
-                length = defaults(length, buffer.length);
-                return new Promise<number>((res, rej) => {
-                    fs.write(file, buffer, 0, length, position, (err, written) => {
-                        if (err) rej(err);
-                        else res(written);
-                    });
-                });
-            },
-            writeBufferSync: (position: number, buffer: Uint8Array, length?: number) => {
-                length = defaults(length, buffer.length);
-                return fs.writeSync(file, buffer, 0, length, position);
-            },
-            close: () => {
-                try {
-                    if (file !== void 0) fs.close(file, noop);
-                } catch (e) {
-
-                }
-            }
-        };
-    }
 }

+ 62 - 0
src/servers/common/file-handle.ts

@@ -0,0 +1,62 @@
+/**
+ * Copyright (c) 2018-2021 mol* contributors, licensed under MIT, See LICENSE file for more info.
+ *
+ * @author Alexander Rose <alexander.rose@weirdbyte.de>
+ * @author David Sehnal <david.sehnal@gmail.com>
+ */
+
+import * as fs from 'fs';
+import { FileHandle } from '../../mol-io/common/file-handle';
+import { SimpleBuffer } from '../../mol-io/common/simple-buffer';
+import { defaults, noop } from '../../mol-util';
+
+export function fileHandleFromDescriptor(file: number, name: string): FileHandle {
+    if (fs === undefined) throw new Error('fs module not available');
+    return {
+        name,
+        readBuffer: (position: number, sizeOrBuffer: SimpleBuffer | number, length?: number, byteOffset?: number) => {
+            return new Promise((res, rej) => {
+                let outBuffer: SimpleBuffer;
+                if (typeof sizeOrBuffer === 'number') {
+                    byteOffset = defaults(byteOffset, 0);
+                    length = defaults(length, sizeOrBuffer);
+                    outBuffer = SimpleBuffer.fromArrayBuffer(new ArrayBuffer(sizeOrBuffer));
+                } else {
+                    byteOffset = defaults(byteOffset, 0);
+                    length = defaults(length, sizeOrBuffer.length);
+                    outBuffer = sizeOrBuffer;
+                }
+                fs.read(file, outBuffer, byteOffset, length, position, (err, bytesRead, buffer) => {
+                    if (err) {
+                        rej(err);
+                        return;
+                    }
+                    if (length !== bytesRead) {
+                        console.warn(`byteCount ${length} and bytesRead ${bytesRead} differ`);
+                    }
+                    res({ bytesRead, buffer });
+                });
+            });
+        },
+        writeBuffer: (position: number, buffer: SimpleBuffer, length?: number) => {
+            length = defaults(length, buffer.length);
+            return new Promise<number>((res, rej) => {
+                fs.write(file, buffer, 0, length, position, (err, written) => {
+                    if (err) rej(err);
+                    else res(written);
+                });
+            });
+        },
+        writeBufferSync: (position: number, buffer: Uint8Array, length?: number) => {
+            length = defaults(length, buffer.length);
+            return fs.writeSync(file, buffer, 0, length, position);
+        },
+        close: () => {
+            try {
+                if (file !== void 0) fs.close(file, noop);
+            } catch (e) {
+
+            }
+        }
+    };
+}

+ 2 - 1
src/servers/volume/pack/format.ts

@@ -10,6 +10,7 @@ import { FileHandle } from '../../../mol-io/common/file-handle';
 import { Ccp4Provider } from './format/ccp4';
 import { TypedArrayBufferContext, TypedArrayValueArray, TypedArrayValueType, getElementByteSize, createTypedArrayBufferContext } from '../../../mol-io/common/typed-array';
 import { Dsn6Provider } from './format/dsn6';
+import { fileHandleFromDescriptor } from '../../common/file-handle';
 
 export interface Header {
     name: string,
@@ -103,7 +104,7 @@ export function getProviderFromType(type: Type): Provider {
 export async function open(name: string, filename: string, type: Type): Promise<Context> {
     const provider = getProviderFromType(type);
     const descriptor = await File.openRead(filename);
-    const file = FileHandle.fromDescriptor(descriptor, filename);
+    const file = fileHandleFromDescriptor(descriptor, filename);
     const header = await provider.readHeader(name, file);
     const data = { header, file, slices: void 0 as any };
     return { data, provider };

+ 2 - 2
src/servers/volume/pack/sampling.ts

@@ -12,9 +12,9 @@ import * as File from '../common/file';
 import * as Downsampling from './downsampling';
 import * as Writer from './writer';
 import * as DataFormat from '../common/data-format';
-import { FileHandle } from '../../../mol-io/common/file-handle';
 import { getElementByteSize, createTypedArray, TypedArrayValueType } from '../../../mol-io/common/typed-array';
 import { SimpleBuffer } from '../../../mol-io/common/simple-buffer';
+import { fileHandleFromDescriptor } from '../../common/file-handle';
 
 export async function createContext(filename: string, channels: Format.Context[], blockSize: number, isPeriodic: boolean): Promise<Data.Context> {
     const { extent, valueType, grid, origin } = channels[0].data.header;
@@ -32,7 +32,7 @@ export async function createContext(filename: string, channels: Format.Context[]
     }
 
     const ctx: Data.Context = {
-        file: FileHandle.fromDescriptor(await File.createFile(filename), filename),
+        file: fileHandleFromDescriptor(await File.createFile(filename), filename),
         isPeriodic,
         channels,
         valueType,

+ 3 - 2
src/servers/volume/server/api.ts

@@ -11,8 +11,9 @@ import { execute } from './query/execute';
 import * as Data from './query/data-model';
 import { ConsoleLogger } from '../../../mol-util/console-logger';
 import * as DataFormat from '../common/data-format';
-import { FileHandle } from '../../../mol-io/common/file-handle';
 import { LimitsConfig } from '../config';
+import { fileHandleFromDescriptor } from '../../common/file-handle';
+import { FileHandle } from '../../../mol-io/common/file-handle';
 
 export function getOutputFilename(source: string, id: string, { asBinary, box, detail, forcedSamplingLevel }: Data.QueryParams) {
     function n(s: string) { return (s || '').replace(/[ \n\t]/g, '').toLowerCase(); }
@@ -66,7 +67,7 @@ async function readHeader(filename: string | undefined, sourceId: string) {
     let file: FileHandle | undefined;
     try {
         if (!filename) return void 0;
-        file = FileHandle.fromDescriptor(await File.openRead(filename), filename);
+        file = fileHandleFromDescriptor(await File.openRead(filename), filename);
         const header = await DataFormat.readHeader(file);
         return header.header;
     } catch (e) {

+ 2 - 1
src/servers/volume/server/query/execute.ts

@@ -23,6 +23,7 @@ import { UUID } from '../../../../mol-util';
 import { FileHandle } from '../../../../mol-io/common/file-handle';
 import { createTypedArray, TypedArrayValueType } from '../../../../mol-io/common/typed-array';
 import { LimitsConfig } from '../../config';
+import { fileHandleFromDescriptor } from '../../../common/file-handle';
 
 export async function execute(params: Data.QueryParams, outputProvider: () => Data.QueryOutputStream) {
     const start = getTime();
@@ -34,7 +35,7 @@ export async function execute(params: Data.QueryParams, outputProvider: () => Da
 
     let sourceFile: FileHandle | undefined;
     try {
-        sourceFile = FileHandle.fromDescriptor(await File.openRead(params.sourceFilename), params.sourceFilename);
+        sourceFile = fileHandleFromDescriptor(await File.openRead(params.sourceFilename), params.sourceFilename);
         await _execute(sourceFile, params, guid, outputProvider);
         return true;
     } catch (e) {