netcdf4-wasm
Version:
NetCDF4 library compiled to WebAssembly with TypeScript bindings
114 lines • 5.54 kB
JavaScript
;
// WASM module loading and wrapping functionality
Object.defineProperty(exports, "__esModule", { value: true });
exports.WasmModuleLoader = void 0;
class WasmModuleLoader {
static async loadModule(options = {}) {
try {
// Load the WASM module
let moduleFactory;
if (typeof window !== 'undefined') {
// Browser environment
if (typeof NetCDF4Module === 'undefined') {
throw new Error('NetCDF4Module not found. Make sure netcdf4.js is loaded.');
}
moduleFactory = NetCDF4Module;
}
else {
// Node.js environment
const path = require('path');
const wasmPath = options.wasmPath || path.join(__dirname, '..', 'dist', 'netcdf4.js');
moduleFactory = require(wasmPath);
}
const rawModule = await moduleFactory({
locateFile: (path) => {
if (options.wasmPath) {
const wasmPath = options.wasmPath.replace('.js', '.wasm');
return wasmPath;
}
// For Node.js environment, provide absolute path to WASM file
if (typeof window === 'undefined') {
const path_module = require('path');
return path_module.join(__dirname, '..', 'dist', 'netcdf4.wasm');
}
return path;
}
});
// Wrap the module with high-level functions
return WasmModuleLoader.wrapModule(rawModule);
}
catch (error) {
throw new Error(`Failed to load NetCDF4 WASM module: ${error}`);
}
}
static wrapModule(module) {
// Create wrappers for NetCDF functions
const nc_open_wrapper = module.cwrap('nc_open_wrapper', 'number', ['string', 'number', 'number']);
const nc_close_wrapper = module.cwrap('nc_close_wrapper', 'number', ['number']);
const nc_create_wrapper = module.cwrap('nc_create_wrapper', 'number', ['string', 'number', 'number']);
const nc_def_dim_wrapper = module.cwrap('nc_def_dim_wrapper', 'number', ['number', 'string', 'number', 'number']);
const nc_def_var_wrapper = module.cwrap('nc_def_var_wrapper', 'number', ['number', 'string', 'number', 'number', 'number', 'number']);
const nc_put_var_double_wrapper = module.cwrap('nc_put_var_double_wrapper', 'number', ['number', 'number', 'number']);
const nc_get_var_double_wrapper = module.cwrap('nc_get_var_double_wrapper', 'number', ['number', 'number', 'number']);
const nc_enddef_wrapper = module.cwrap('nc_enddef_wrapper', 'number', ['number']);
return {
...module,
nc_open: (path, mode) => {
const ncidPtr = module._malloc(4);
const result = nc_open_wrapper(path, mode, ncidPtr);
const ncid = module.getValue(ncidPtr, 'i32');
module._free(ncidPtr);
return { result, ncid };
},
nc_close: (ncid) => {
return nc_close_wrapper(ncid);
},
nc_create: (path, mode) => {
const ncidPtr = module._malloc(4);
const result = nc_create_wrapper(path, mode, ncidPtr);
const ncid = module.getValue(ncidPtr, 'i32');
module._free(ncidPtr);
return { result, ncid };
},
nc_def_dim: (ncid, name, len) => {
const dimidPtr = module._malloc(4);
const result = nc_def_dim_wrapper(ncid, name, len, dimidPtr);
const dimid = module.getValue(dimidPtr, 'i32');
module._free(dimidPtr);
return { result, dimid };
},
nc_def_var: (ncid, name, xtype, ndims, dimids) => {
const varidPtr = module._malloc(4);
const dimidsPtr = module._malloc(dimids.length * 4);
for (let i = 0; i < dimids.length; i++) {
module.setValue(dimidsPtr + i * 4, dimids[i], 'i32');
}
const result = nc_def_var_wrapper(ncid, name, xtype, ndims, dimidsPtr, varidPtr);
const varid = module.getValue(varidPtr, 'i32');
module._free(varidPtr);
module._free(dimidsPtr);
return { result, varid };
},
nc_put_var_double: (ncid, varid, data) => {
const dataPtr = module._malloc(data.length * 8);
module.HEAPF64.set(data, dataPtr / 8);
const result = nc_put_var_double_wrapper(ncid, varid, dataPtr);
module._free(dataPtr);
return result;
},
nc_get_var_double: (ncid, varid, size) => {
const dataPtr = module._malloc(size * 8);
const result = nc_get_var_double_wrapper(ncid, varid, dataPtr);
const data = new Float64Array(module.HEAPF64.buffer, dataPtr, size);
const resultData = new Float64Array(data);
module._free(dataPtr);
return { result, data: resultData };
},
nc_enddef: (ncid) => {
return nc_enddef_wrapper(ncid);
}
};
}
}
exports.WasmModuleLoader = WasmModuleLoader;
//# sourceMappingURL=wasm-module.js.map