xm-netcdf-loader 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/composables/useLeafletMap.d.ts +10 -1
  2. package/dist/xm-netcdf-loader.cjs.js +1 -1
  3. package/dist/xm-netcdf-loader.cjs.js.map +1 -1
  4. package/dist/xm-netcdf-loader.es.js +527 -523
  5. package/dist/xm-netcdf-loader.es.js.map +1 -1
  6. package/dist/xm-netcdf-loader.umd.js +1 -1
  7. package/dist/xm-netcdf-loader.umd.js.map +1 -1
  8. package/package.json +3 -3
  9. package/dist/wasm/constants.d.ts +0 -158
  10. package/dist/wasm/constants.d.ts.map +0 -1
  11. package/dist/wasm/constants.js +0 -249
  12. package/dist/wasm/constants.js.map +0 -1
  13. package/dist/wasm/dimension.d.ts +0 -9
  14. package/dist/wasm/dimension.d.ts.map +0 -1
  15. package/dist/wasm/dimension.js +0 -19
  16. package/dist/wasm/dimension.js.map +0 -1
  17. package/dist/wasm/group.d.ts +0 -35
  18. package/dist/wasm/group.d.ts.map +0 -1
  19. package/dist/wasm/group.js +0 -189
  20. package/dist/wasm/group.js.map +0 -1
  21. package/dist/wasm/index.d.ts +0 -17
  22. package/dist/wasm/index.d.ts.map +0 -1
  23. package/dist/wasm/index.js +0 -49
  24. package/dist/wasm/index.js.map +0 -1
  25. package/dist/wasm/netcdf-getters.d.ts +0 -120
  26. package/dist/wasm/netcdf-getters.d.ts.map +0 -1
  27. package/dist/wasm/netcdf-getters.js +0 -816
  28. package/dist/wasm/netcdf-getters.js.map +0 -1
  29. package/dist/wasm/netcdf-worker.d.ts +0 -2
  30. package/dist/wasm/netcdf-worker.d.ts.map +0 -1
  31. package/dist/wasm/netcdf-worker.js +0 -154
  32. package/dist/wasm/netcdf-worker.js.map +0 -1
  33. package/dist/wasm/netcdf4-wasm.js +0 -2
  34. package/dist/wasm/netcdf4-wasm.wasm +0 -0
  35. package/dist/wasm/netcdf4.d.ts +0 -218
  36. package/dist/wasm/netcdf4.d.ts.map +0 -1
  37. package/dist/wasm/netcdf4.js +0 -1049
  38. package/dist/wasm/netcdf4.js.map +0 -1
  39. package/dist/wasm/slice.d.ts +0 -57
  40. package/dist/wasm/slice.d.ts.map +0 -1
  41. package/dist/wasm/slice.js +0 -60
  42. package/dist/wasm/slice.js.map +0 -1
  43. package/dist/wasm/test-setup.d.ts +0 -13
  44. package/dist/wasm/test-setup.d.ts.map +0 -1
  45. package/dist/wasm/test-setup.js +0 -78
  46. package/dist/wasm/test-setup.js.map +0 -1
  47. package/dist/wasm/types.d.ts +0 -444
  48. package/dist/wasm/types.d.ts.map +0 -1
  49. package/dist/wasm/types.js +0 -3
  50. package/dist/wasm/types.js.map +0 -1
  51. package/dist/wasm/variable.d.ts +0 -36
  52. package/dist/wasm/variable.d.ts.map +0 -1
  53. package/dist/wasm/variable.js +0 -152
  54. package/dist/wasm/variable.js.map +0 -1
  55. package/dist/wasm/wasm-module.d.ts +0 -6
  56. package/dist/wasm/wasm-module.d.ts.map +0 -1
  57. package/dist/wasm/wasm-module.js +0 -1502
  58. package/dist/wasm/wasm-module.js.map +0 -1
@@ -1,1502 +0,0 @@
1
- // WASM module loading and wrapping functionality
2
- import { NC_CONSTANTS, DATA_TYPE_SIZE } from './constants.js';
3
- const NC_MAX_NAME = 256;
4
- const NC_MAX_DIMS = 1024;
5
- const NC_MAX_VARS = 8192;
6
- function stridedLength(count) {
7
- return count.reduce((acc, c) => acc * c, 1);
8
- }
9
- // Helper: validates that the total byte allocation won't overflow a WASM32 uint32.
10
- // Throws a RangeError if the allocation would be unsafe.
11
- function safeByteLength(totalLength, elementSize) {
12
- const byteLength = totalLength * elementSize;
13
- if (byteLength > 0xFFFFFFFF) {
14
- throw new RangeError(`Allocation size ${byteLength} exceeds WASM32 heap limit (0xFFFFFFFF). ` +
15
- `Requested ${totalLength} elements of ${elementSize} bytes each.`);
16
- }
17
- return byteLength;
18
- }
19
- export class WasmModuleLoader {
20
- static async loadModule(options = {}) {
21
- try {
22
- if (typeof window === 'undefined') {
23
- throw new Error('NetCDF4-WASM only works in browser environments.');
24
- }
25
- // Dynamically import the generated netcdf4-wasm.js module
26
- const netcdf4Module = await import('./netcdf4-wasm.js');
27
- const createNetCDF4Module = netcdf4Module.default;
28
- // Use the imported module factory
29
- const rawModule = await createNetCDF4Module({
30
- locateFile: (file) => {
31
- if (file.endsWith('.wasm')) {
32
- return options.wasmPath || './netcdf4-wasm.wasm';
33
- }
34
- return file;
35
- }
36
- });
37
- // Wrap the module with high-level functions
38
- return WasmModuleLoader.wrapModule(rawModule);
39
- }
40
- catch (error) {
41
- throw new Error(`Failed to load NetCDF4 WASM module: ${error}`);
42
- }
43
- }
44
- static wrapModule(module) {
45
- // Create wrappers for NetCDF functions
46
- // https://docs.unidata.ucar.edu/netcdf-c/current/group__variables.html#details
47
- const nc_open_wrapper = module.cwrap('nc_open_wrapper', 'number', ['string', 'number', 'number']);
48
- const nc_close_wrapper = module.cwrap('nc_close_wrapper', 'number', ['number']);
49
- const nc_create_wrapper = module.cwrap('nc_create_wrapper', 'number', ['string', 'number', 'number']);
50
- const nc_def_dim_wrapper = module.cwrap('nc_def_dim_wrapper', 'number', ['number', 'string', 'number', 'number']);
51
- const nc_def_var_wrapper = module.cwrap('nc_def_var_wrapper', 'number', ['number', 'string', 'number', 'number', 'number', 'number']);
52
- const nc_put_var_double_wrapper = module.cwrap('nc_put_var_double_wrapper', 'number', ['number', 'number', 'number']);
53
- // const nc_get_var_double_wrapper = module.cwrap('nc_get_var_double_wrapper', 'number', ['number', 'number', 'number']);
54
- const nc_enddef_wrapper = module.cwrap('nc_enddef_wrapper', 'number', ['number']);
55
- // Dimension inquiry wrappers
56
- const nc_inq_ndims_wrapper = module.cwrap('nc_inq_ndims_wrapper', 'number', ['number', 'number']);
57
- const nc_inq_unlimdim_wrapper = module.cwrap('nc_inq_unlimdim_wrapper', 'number', ['number', 'number']);
58
- const nc_inq_dimids_wrapper = module.cwrap('nc_inq_dimids_wrapper', 'number', ['number', 'number', 'number', 'number']);
59
- const nc_inq_dim_wrapper = module.cwrap('nc_inq_dim_wrapper', 'number', ['number', 'number', 'number', 'number']);
60
- const nc_inq_dimid_wrapper = module.cwrap('nc_inq_dimid_wrapper', 'number', ['number', 'string', 'number']);
61
- const nc_inq_dimlen_wrapper = module.cwrap('nc_inq_dimlen_wrapper', 'number', ['number', 'number', 'number']);
62
- const nc_inq_dimname_wrapper = module.cwrap('nc_inq_dimname_wrapper', 'number', ['number', 'number', 'number']);
63
- // Variable inquiry wrappers
64
- const nc_inq_nvars_wrapper = module.cwrap('nc_inq_nvars_wrapper', 'number', ['number', 'number']);
65
- const nc_inq_varids_wrapper = module.cwrap('nc_inq_varids_wrapper', 'number', ['number', 'number', 'number']);
66
- const nc_inq_varid_wrapper = module.cwrap('nc_inq_varid_wrapper', 'number', ['number', 'string', 'number']);
67
- const nc_inq_var_wrapper = module.cwrap('nc_inq_var_wrapper', 'number', [
68
- 'number', 'number', // ncid, varid
69
- 'number', // name pointer
70
- 'number', 'number', 'number', 'number' // typep, ndimsp, dimidsp, nattsp
71
- ]);
72
- // Variable inquiry wrappers
73
- const nc_inq_varname_wrapper = module.cwrap('nc_inq_varname_wrapper', 'number', ['number', 'number', 'number']);
74
- const nc_inq_vartype_wrapper = module.cwrap('nc_inq_vartype_wrapper', 'number', ['number', 'number', 'number']);
75
- const nc_inq_varndims_wrapper = module.cwrap('nc_inq_varndims_wrapper', 'number', ['number', 'number', 'number']);
76
- const nc_inq_vardimid_wrapper = module.cwrap('nc_inq_vardimid_wrapper', 'number', ['number', 'number', 'number']);
77
- const nc_inq_varnatts_wrapper = module.cwrap('nc_inq_varnatts_wrapper', 'number', ['number', 'number', 'number']);
78
- const nc_inq_var_chunking_wrapper = module.cwrap('nc_inq_var_chunking_wrapper', 'number', ['number', 'number', 'number', 'number']);
79
- // Attribute inquiry wrappers
80
- const nc_inq_natts_wrapper = module.cwrap('nc_inq_natts_wrapper', 'number', ['number', 'number']);
81
- const nc_inq_att_wrapper = module.cwrap('nc_inq_att_wrapper', 'number', ['number', 'number', 'string', 'number', 'number']);
82
- const nc_inq_attid_wrapper = module.cwrap('nc_inq_attid_wrapper', 'number', ['number', 'number', 'string', 'number']);
83
- const nc_inq_attname_wrapper = module.cwrap('nc_inq_attname_wrapper', 'number', ['number', 'number', 'number', 'number']);
84
- const nc_inq_atttype_wrapper = module.cwrap('nc_inq_atttype_wrapper', 'number', ['number', 'number', 'string', 'number']);
85
- const nc_inq_attlen_wrapper = module.cwrap('nc_inq_attlen_wrapper', 'number', ['number', 'number', 'string', 'number']);
86
- // Attribute getters
87
- const nc_get_att_text_wrapper = module.cwrap('nc_get_att_text_wrapper', 'number', ['number', 'number', 'string', 'number']);
88
- const nc_get_att_short_wrapper = module.cwrap('nc_get_att_short_wrapper', 'number', ['number', 'number', 'string', 'number']);
89
- const nc_get_att_int_wrapper = module.cwrap('nc_get_att_int_wrapper', 'number', ['number', 'number', 'string', 'number']);
90
- const nc_get_att_float_wrapper = module.cwrap('nc_get_att_float_wrapper', 'number', ['number', 'number', 'string', 'number']);
91
- const nc_get_att_double_wrapper = module.cwrap('nc_get_att_double_wrapper', 'number', ['number', 'number', 'string', 'number']);
92
- const nc_get_att_longlong_wrapper = module.cwrap('nc_get_att_longlong_wrapper', 'number', ['number', 'number', 'string', 'number']);
93
- const nc_get_att_string_wrapper = module.cwrap('nc_get_att_string_wrapper', 'number', ['number', 'number', 'string', 'number']);
94
- const nc_free_string_wrapper = module.cwrap('nc_free_string_wrapper', 'number', ['number', 'number']);
95
- const nc_get_att_schar_wrapper = module.cwrap('nc_get_att_schar_wrapper', 'number', ['number', 'number', 'string', 'number']);
96
- // 8-bit unsigned
97
- const nc_get_att_uchar_wrapper = module.cwrap('nc_get_att_uchar_wrapper', 'number', ['number', 'number', 'string', 'number']);
98
- // 16-bit unsigned
99
- const nc_get_att_ushort_wrapper = module.cwrap('nc_get_att_ushort_wrapper', 'number', ['number', 'number', 'string', 'number']);
100
- // 32-bit unsigned
101
- const nc_get_att_uint_wrapper = module.cwrap('nc_get_att_uint_wrapper', 'number', ['number', 'number', 'string', 'number']);
102
- // 64-bit unsigned
103
- const nc_get_att_ulonglong_wrapper = module.cwrap('nc_get_att_ulonglong_wrapper', 'number', ['number', 'number', 'string', 'number']);
104
- // Variable getters
105
- const nc_get_vara_short_wrapper = module.cwrap('nc_get_vara_short_wrapper', 'number', ['number', 'number', 'number', 'number', 'number']);
106
- const nc_get_vara_int_wrapper = module.cwrap('nc_get_vara_int_wrapper', 'number', ['number', 'number', 'number', 'number', 'number']);
107
- const nc_get_vara_float_wrapper = module.cwrap('nc_get_vara_float_wrapper', 'number', ['number', 'number', 'number', 'number', 'number']);
108
- const nc_get_vara_double_wrapper = module.cwrap('nc_get_vara_double_wrapper', 'number', ['number', 'number', 'number', 'number', 'number']);
109
- const nc_get_vara_longlong_wrapper = module.cwrap('nc_get_vara_longlong_wrapper', 'number', ['number', 'number', 'number', 'number', 'number']);
110
- const nc_get_vara_schar_wrapper = module.cwrap('nc_get_vara_schar_wrapper', 'number', ['number', 'number', 'number', 'number', 'number']);
111
- const nc_get_vara_uchar_wrapper = module.cwrap('nc_get_vara_uchar_wrapper', 'number', ['number', 'number', 'number', 'number', 'number']);
112
- const nc_get_vara_ushort_wrapper = module.cwrap('nc_get_vara_ushort_wrapper', 'number', ['number', 'number', 'number', 'number', 'number']);
113
- const nc_get_vara_uint_wrapper = module.cwrap('nc_get_vara_uint_wrapper', 'number', ['number', 'number', 'number', 'number', 'number']);
114
- const nc_get_vara_ulonglong_wrapper = module.cwrap('nc_get_vara_ulonglong_wrapper', 'number', ['number', 'number', 'number', 'number', 'number']);
115
- const nc_get_vara_string_wrapper = module.cwrap('nc_get_vara_string_wrapper', 'number', ['number', 'number', 'number', 'number', 'number']);
116
- const nc_get_var_text_wrapper = module.cwrap('nc_get_var_text_wrapper', 'number', ['number', 'number', 'number']);
117
- const nc_get_var_short_wrapper = module.cwrap('nc_get_var_short_wrapper', 'number', ['number', 'number', 'number']);
118
- const nc_get_var_int_wrapper = module.cwrap('nc_get_var_int_wrapper', 'number', ['number', 'number', 'number']);
119
- const nc_get_var_longlong_wrapper = module.cwrap('nc_get_var_longlong_wrapper', 'number', ['number', 'number', 'number']);
120
- const nc_get_var_float_wrapper = module.cwrap('nc_get_var_float_wrapper', 'number', ['number', 'number', 'number']);
121
- const nc_get_var_double_wrapper = module.cwrap('nc_get_var_double_wrapper', 'number', ['number', 'number', 'number']);
122
- const nc_get_var_schar_wrapper = module.cwrap('nc_get_var_schar_wrapper', 'number', ['number', 'number', 'number']);
123
- const nc_get_var_uchar_wrapper = module.cwrap('nc_get_var_uchar_wrapper', 'number', ['number', 'number', 'number']);
124
- const nc_get_var_ushort_wrapper = module.cwrap('nc_get_var_ushort_wrapper', 'number', ['number', 'number', 'number']);
125
- const nc_get_var_uint_wrapper = module.cwrap('nc_get_var_uint_wrapper', 'number', ['number', 'number', 'number']);
126
- const nc_get_var_ulonglong_wrapper = module.cwrap('nc_get_var_ulonglong_wrapper', 'number', ['number', 'number', 'number']);
127
- const nc_get_var_string_wrapper = module.cwrap('nc_get_var_string_wrapper', 'number', ['number', 'number', 'number']);
128
- // Stride inquiry wrappers
129
- const nc_get_vars_schar_wrapper = module.cwrap('nc_get_vars_schar_wrapper', 'number', ['number', 'number', 'number', 'number', 'number', 'number']);
130
- const nc_get_vars_uchar_wrapper = module.cwrap('nc_get_vars_uchar_wrapper', 'number', ['number', 'number', 'number', 'number', 'number', 'number']);
131
- const nc_get_vars_short_wrapper = module.cwrap('nc_get_vars_short_wrapper', 'number', ['number', 'number', 'number', 'number', 'number', 'number']);
132
- const nc_get_vars_ushort_wrapper = module.cwrap('nc_get_vars_ushort_wrapper', 'number', ['number', 'number', 'number', 'number', 'number', 'number']);
133
- const nc_get_vars_int_wrapper = module.cwrap('nc_get_vars_int_wrapper', 'number', ['number', 'number', 'number', 'number', 'number', 'number']);
134
- const nc_get_vars_uint_wrapper = module.cwrap('nc_get_vars_uint_wrapper', 'number', ['number', 'number', 'number', 'number', 'number', 'number']);
135
- const nc_get_vars_float_wrapper = module.cwrap('nc_get_vars_float_wrapper', 'number', ['number', 'number', 'number', 'number', 'number', 'number']);
136
- const nc_get_vars_double_wrapper = module.cwrap('nc_get_vars_double_wrapper', 'number', ['number', 'number', 'number', 'number', 'number', 'number']);
137
- const nc_get_vars_longlong_wrapper = module.cwrap('nc_get_vars_longlong_wrapper', 'number', ['number', 'number', 'number', 'number', 'number', 'number']);
138
- const nc_get_vars_ulonglong_wrapper = module.cwrap('nc_get_vars_ulonglong_wrapper', 'number', ['number', 'number', 'number', 'number', 'number', 'number']);
139
- const nc_get_vars_string_wrapper = module.cwrap('nc_get_vars_string_wrapper', 'number', ['number', 'number', 'number', 'number', 'number', 'number']);
140
- const nc_get_vars_wrapper = module.cwrap('nc_get_vars_wrapper', 'number', ['number', 'number', 'number', 'number', 'number', 'number']);
141
- const nc_get_vars_text_wrapper = module.cwrap('nc_get_vars_text_wrapper', 'number', ['number', 'number', 'number', 'number', 'number', 'number']);
142
- // const nc_get_vars_as_type_wrapper = module.cwrap('nc_get_vars_as_type_wrapper', 'number', ['number','number','number','number','number','number','number']);
143
- // Group inquiry wrappers
144
- const nc_inq_grps_wrapper = module.cwrap('nc_inq_grps_wrapper', 'number', ['number', 'number', 'number']);
145
- const nc_inq_grp_ncid_wrapper = module.cwrap('nc_inq_grp_ncid_wrapper', 'number', ['number', 'string', 'number']);
146
- const nc_inq_grpname_wrapper = module.cwrap('nc_inq_grpname_wrapper', 'number', ['number', 'number']);
147
- const nc_inq_grp_parent_wrapper = module.cwrap('nc_inq_grp_parent_wrapper', 'number', ['number', 'number']);
148
- const nc_inq_grp_full_ncid_wrapper = module.cwrap('nc_inq_grp_full_ncid_wrapper', 'number', ['number', 'string', 'number']);
149
- const nc_inq_grpname_full_wrapper = module.cwrap('nc_inq_grpname_full_wrapper', 'number', ['number', 'number', 'number']);
150
- const nc_inq_grpname_len_wrapper = module.cwrap('nc_inq_grpname_len_wrapper', 'number', ['number', 'number']);
151
- // enum wrappers
152
- const nc_inq_typeids_wrapper = module.cwrap('nc_inq_typeids_wrapper', 'number', ['number', 'number', 'number']);
153
- const nc_inq_type_wrapper = module.cwrap('nc_inq_type_wrapper', 'number', ['number', 'number', 'number', 'number']);
154
- const nc_inq_user_type_wrapper = module.cwrap('nc_inq_user_type_wrapper', 'number', ['number', 'number', 'number', 'number', 'number', 'number', 'number']);
155
- const nc_def_enum_wrapper = module.cwrap('nc_def_enum_wrapper', 'number', ['number', 'number', 'string', 'number']);
156
- const nc_insert_enum_wrapper = module.cwrap('nc_insert_enum_wrapper', 'number', ['number', 'number', 'string', 'number']);
157
- const nc_inq_enum_wrapper = module.cwrap('nc_inq_enum_wrapper', 'number', ['number', 'number', 'number', 'number', 'number', 'number']);
158
- const nc_inq_enum_member_wrapper = module.cwrap('nc_inq_enum_member_wrapper', 'number', ['number', 'number', 'number', 'number', 'number']);
159
- const nc_inq_enum_ident_wrapper = module.cwrap('nc_inq_enum_ident_wrapper', 'number', ['number', 'number', 'number', 'number']);
160
- // generic type inquiry wrapper
161
- const nc_get_var_wrapper = module.cwrap('nc_get_var_wrapper', 'number', ['number', 'number', 'number']);
162
- const nc_get_vara_wrapper = module.cwrap('nc_get_vara_wrapper', 'number', ['number', 'number', 'number', 'number', 'number']);
163
- return {
164
- ...module,
165
- nc_open: (path, mode) => {
166
- const ncidPtr = module._malloc(4);
167
- const result = nc_open_wrapper(path, mode, ncidPtr);
168
- const ncid = module.getValue(ncidPtr, 'i32');
169
- module._free(ncidPtr);
170
- return { result, ncid };
171
- },
172
- nc_close: (ncid) => {
173
- return nc_close_wrapper(ncid);
174
- },
175
- nc_create: (path, mode) => {
176
- const ncidPtr = module._malloc(4);
177
- const result = nc_create_wrapper(path, mode, ncidPtr);
178
- const ncid = module.getValue(ncidPtr, 'i32');
179
- module._free(ncidPtr);
180
- return { result, ncid };
181
- },
182
- // ---- Dimension Inquiry ----//
183
- nc_inq_ndims: (ncid) => {
184
- const ndimsPtr = module._malloc(4);
185
- const result = nc_inq_ndims_wrapper(ncid, ndimsPtr);
186
- const ndims = result === NC_CONSTANTS.NC_NOERR ? module.getValue(ndimsPtr, 'i32') : undefined;
187
- module._free(ndimsPtr);
188
- return { result, ndims };
189
- },
190
- nc_inq_unlimdim: (ncid) => {
191
- const unlimdimidPtr = module._malloc(4);
192
- const result = nc_inq_unlimdim_wrapper(ncid, unlimdimidPtr);
193
- const unlimdimid = result === NC_CONSTANTS.NC_NOERR ? module.getValue(unlimdimidPtr, 'i32') : undefined;
194
- module._free(unlimdimidPtr);
195
- return { result, unlimdimid };
196
- },
197
- nc_inq_dimids: (ncid, include_parents = 0) => {
198
- const ndimsPtr = module._malloc(4);
199
- const dimidsPtr = module._malloc(NC_MAX_DIMS * 4);
200
- const result = nc_inq_dimids_wrapper(ncid, ndimsPtr, dimidsPtr, include_parents);
201
- let ndims, dimids;
202
- if (result === NC_CONSTANTS.NC_NOERR) {
203
- ndims = module.getValue(ndimsPtr, 'i32');
204
- dimids = Int32Array.from({ length: ndims }, (_, i) => module.getValue(dimidsPtr + (i * 4), 'i32'));
205
- }
206
- module._free(ndimsPtr);
207
- module._free(dimidsPtr);
208
- return { result, ndims, dimids };
209
- },
210
- nc_inq_dim: (ncid, dimid) => {
211
- const namePtr = module._malloc(NC_MAX_NAME + 1);
212
- // In Emscripten wasm32 builds, size_t is 32-bit.
213
- // (If we ever build wasm64, this will need revisiting.)
214
- const lenPtr = module._malloc(4);
215
- const result = nc_inq_dim_wrapper(ncid, dimid, namePtr, lenPtr);
216
- let name, len;
217
- if (result === NC_CONSTANTS.NC_NOERR) {
218
- name = module.UTF8ToString(namePtr);
219
- len = module.getValue(lenPtr, 'i32') >>> 0;
220
- }
221
- module._free(namePtr);
222
- module._free(lenPtr);
223
- return { result, name, len };
224
- },
225
- nc_inq_dimid: (ncid, name) => {
226
- const dimidPtr = module._malloc(4);
227
- const result = nc_inq_dimid_wrapper(ncid, name, dimidPtr);
228
- const dimid = result === NC_CONSTANTS.NC_NOERR ? module.getValue(dimidPtr, 'i32') : undefined;
229
- module._free(dimidPtr);
230
- return { result, dimid };
231
- },
232
- nc_inq_dimlen: (ncid, dimid) => {
233
- // In Emscripten wasm32 builds, size_t is 32-bit.
234
- // Allocate 4 bytes and read as unsigned i32 to avoid garbage high bits.
235
- const lenPtr = module._malloc(4);
236
- const result = nc_inq_dimlen_wrapper(ncid, dimid, lenPtr);
237
- let len;
238
- if (result === NC_CONSTANTS.NC_NOERR) {
239
- len = module.getValue(lenPtr, 'i32') >>> 0;
240
- }
241
- module._free(lenPtr);
242
- return { result, len };
243
- },
244
- nc_inq_dimname: (ncid, dimid) => {
245
- const namePtr = module._malloc(NC_MAX_NAME + 1);
246
- module.HEAPU8.fill(0, namePtr, namePtr + NC_MAX_NAME + 1);
247
- const result = nc_inq_dimname_wrapper(ncid, dimid, namePtr);
248
- const name = result === NC_CONSTANTS.NC_NOERR ? module.UTF8ToString(namePtr) : undefined;
249
- module._free(namePtr);
250
- return { result, name };
251
- },
252
- //---- Variable inquiry functions ----//
253
- nc_inq_nvars: (ncid) => {
254
- const nvarsPtr = module._malloc(4);
255
- const result = nc_inq_nvars_wrapper(ncid, nvarsPtr);
256
- const nvars = result === NC_CONSTANTS.NC_NOERR ? module.getValue(nvarsPtr, 'i32') : undefined;
257
- module._free(nvarsPtr);
258
- return { result, nvars };
259
- },
260
- nc_inq_varids: (ncid) => {
261
- const nvarsPtr = module._malloc(4);
262
- const varidsPtr = module._malloc(NC_MAX_VARS * 4);
263
- const result = nc_inq_varids_wrapper(ncid, nvarsPtr, varidsPtr);
264
- let nvars, varids;
265
- if (result === NC_CONSTANTS.NC_NOERR) {
266
- nvars = module.getValue(nvarsPtr, 'i32');
267
- varids = Int32Array.from({ length: nvars }, (_, i) => module.getValue(varidsPtr + (i * 4), 'i32'));
268
- }
269
- module._free(nvarsPtr);
270
- module._free(varidsPtr);
271
- return { result, nvars, varids };
272
- },
273
- nc_inq_varid: (ncid, name) => {
274
- const varidPtr = module._malloc(4);
275
- const result = nc_inq_varid_wrapper(ncid, name, varidPtr);
276
- const varid = result === NC_CONSTANTS.NC_NOERR ? module.getValue(varidPtr, 'i32') : undefined;
277
- module._free(varidPtr);
278
- return { result, varid };
279
- },
280
- nc_inq_var: (ncid, varid) => {
281
- const namePtr = module._malloc(NC_MAX_NAME + 1);
282
- const typePtr = module._malloc(4);
283
- const ndimsPtr = module._malloc(4);
284
- const dimidsPtr = module._malloc(NC_MAX_DIMS * 4);
285
- const nattsPtr = module._malloc(4);
286
- const result = nc_inq_var_wrapper(ncid, varid, namePtr, typePtr, ndimsPtr, dimidsPtr, nattsPtr);
287
- let name, type, ndims, dimids, natts;
288
- if (result === NC_CONSTANTS.NC_NOERR) {
289
- name = module.UTF8ToString(namePtr);
290
- type = module.getValue(typePtr, 'i32');
291
- ndims = module.getValue(ndimsPtr, 'i32');
292
- natts = module.getValue(nattsPtr, 'i32');
293
- dimids = Int32Array.from({ length: ndims }, (_, i) => module.getValue(dimidsPtr + (i * 4), 'i32'));
294
- }
295
- module._free(namePtr);
296
- module._free(typePtr);
297
- module._free(ndimsPtr);
298
- module._free(dimidsPtr);
299
- module._free(nattsPtr);
300
- return { result, name, type, ndims, dimids, natts };
301
- },
302
- nc_inq_varname: (ncid, varid) => {
303
- const namePtr = module._malloc(NC_MAX_NAME + 1);
304
- const result = nc_inq_varname_wrapper(ncid, varid, namePtr);
305
- const name = result === NC_CONSTANTS.NC_NOERR ? module.UTF8ToString(namePtr) : undefined;
306
- module._free(namePtr);
307
- return { result, name };
308
- },
309
- nc_inq_vartype: (ncid, varid) => {
310
- const typePtr = module._malloc(4);
311
- const result = nc_inq_vartype_wrapper(ncid, varid, typePtr);
312
- const type = result === NC_CONSTANTS.NC_NOERR ? module.getValue(typePtr, 'i32') : undefined;
313
- module._free(typePtr);
314
- return { result, type };
315
- },
316
- nc_inq_varndims: (ncid, varid) => {
317
- const ndimsPtr = module._malloc(4);
318
- const result = nc_inq_varndims_wrapper(ncid, varid, ndimsPtr);
319
- const ndims = result === NC_CONSTANTS.NC_NOERR ? module.getValue(ndimsPtr, 'i32') : undefined;
320
- module._free(ndimsPtr);
321
- return { result, ndims };
322
- },
323
- nc_inq_vardimid: (ncid, varid) => {
324
- const ndimsPtr = module._malloc(4);
325
- const dimidsPtr = module._malloc(NC_MAX_DIMS * 4);
326
- const result = nc_inq_vardimid_wrapper(ncid, varid, dimidsPtr); // Note: this wrapper doesn't return ndims first
327
- // nc_inq_vardimid writes directly into dimids array; we need ndims separately or assume max
328
- // Better: always call nc_inq_varndims first in practice, or use nc_inq_var
329
- // For standalone use, we'll read up to NC_MAX_DIMS
330
- let dimids;
331
- if (result === NC_CONSTANTS.NC_NOERR) {
332
- // You may want to get ndims first via nc_inq_varndims for exact length
333
- dimids = Int32Array.from(new Int32Array(module.HEAP32.buffer, dimidsPtr, NC_MAX_DIMS));
334
- // Trim trailing -1 or invalid values if needed
335
- }
336
- module._free(ndimsPtr);
337
- module._free(dimidsPtr);
338
- return { result, dimids };
339
- },
340
- nc_inq_varnatts: (ncid, varid) => {
341
- const nattsPtr = module._malloc(4);
342
- const result = nc_inq_varnatts_wrapper(ncid, varid, nattsPtr);
343
- const natts = result === NC_CONSTANTS.NC_NOERR ? module.getValue(nattsPtr, 'i32') : undefined;
344
- module._free(nattsPtr);
345
- return { result, natts };
346
- },
347
- nc_inq_var_chunking: (ncid, varid) => {
348
- const chunkingPtr = module._malloc(4);
349
- const chunkSizesPtr = module._malloc(NC_MAX_DIMS * 4); // assuming size_t is 8 bytes
350
- const result = nc_inq_var_chunking_wrapper(ncid, varid, chunkingPtr, chunkSizesPtr);
351
- let chunking, chunkSizes;
352
- if (result === NC_CONSTANTS.NC_NOERR) {
353
- chunking = module.getValue(chunkingPtr, 'i32');
354
- // First, get the number of dimensions for this variable
355
- const ndimsPtr = module._malloc(4);
356
- const inqResult = nc_inq_varndims_wrapper(ncid, varid, ndimsPtr);
357
- let ndims = NC_MAX_DIMS; // default fallback
358
- if (inqResult === NC_CONSTANTS.NC_NOERR) {
359
- ndims = module.getValue(ndimsPtr, 'i32');
360
- }
361
- module._free(ndimsPtr);
362
- // Only read the actual number of dimensions
363
- chunkSizes = new Array(ndims);
364
- for (let i = 0; i < ndims; i++) {
365
- chunkSizes[i] = module.getValue(chunkSizesPtr + i * 4, 'i32');
366
- }
367
- }
368
- module._free(chunkingPtr);
369
- module._free(chunkSizesPtr);
370
- return { result, chunking, chunkSizes };
371
- },
372
- //---- Attribute inquiry functions ----//
373
- nc_inq_natts: (ncid) => {
374
- const nattsPtr = module._malloc(4);
375
- const result = nc_inq_natts_wrapper(ncid, nattsPtr);
376
- const natts = result === NC_CONSTANTS.NC_NOERR ? module.getValue(nattsPtr, 'i32') : undefined;
377
- module._free(nattsPtr);
378
- return { result, natts };
379
- },
380
- nc_inq_att: (ncid, varid, name) => {
381
- const typePtr = module._malloc(4);
382
- const lenPtr = module._malloc(8);
383
- const result = nc_inq_att_wrapper(ncid, varid, name, typePtr, lenPtr);
384
- let type, len;
385
- if (result === NC_CONSTANTS.NC_NOERR) {
386
- type = module.getValue(typePtr, 'i32');
387
- len = module.getValue(lenPtr, 'i32');
388
- }
389
- module._free(typePtr);
390
- module._free(lenPtr);
391
- return { result, type, len };
392
- },
393
- nc_inq_attid: (ncid, varid, name) => {
394
- const attnumPtr = module._malloc(4);
395
- const result = nc_inq_attid_wrapper(ncid, varid, name, attnumPtr);
396
- const attnum = result === NC_CONSTANTS.NC_NOERR ? module.getValue(attnumPtr, 'i32') : undefined;
397
- module._free(attnumPtr);
398
- return { result, attnum };
399
- },
400
- nc_inq_attname: (ncid, varid, attnum) => {
401
- const namePtr = module._malloc(NC_MAX_NAME + 1);
402
- const result = nc_inq_attname_wrapper(ncid, varid, attnum, namePtr);
403
- const name = result === NC_CONSTANTS.NC_NOERR ? module.UTF8ToString(namePtr) : undefined;
404
- module._free(namePtr);
405
- return { result, name };
406
- },
407
- nc_inq_atttype: (ncid, varid, name) => {
408
- const typePtr = module._malloc(4);
409
- const result = nc_inq_atttype_wrapper(ncid, varid, name, typePtr);
410
- const type = result === NC_CONSTANTS.NC_NOERR ? module.getValue(typePtr, 'i32') : undefined;
411
- module._free(typePtr);
412
- return { result, type };
413
- },
414
- nc_inq_attlen: (ncid, varid, name) => {
415
- const lenPtr = module._malloc(8);
416
- const result = nc_inq_attlen_wrapper(ncid, varid, name, lenPtr);
417
- const len = result === NC_CONSTANTS.NC_NOERR ? module.getValue(lenPtr, 'i64') : undefined;
418
- module._free(lenPtr);
419
- return { result, len };
420
- },
421
- //---- Attribute Getters ----//
422
- nc_get_att_text: (ncid, varid, name, length) => {
423
- const dataPtr = module._malloc(length + 1);
424
- const result = nc_get_att_text_wrapper(ncid, varid, name, dataPtr);
425
- module.setValue(dataPtr + length, 0, 'i8'); // Add null terminator so it doesn't read too far
426
- const data = result === NC_CONSTANTS.NC_NOERR
427
- ? module.UTF8ToString(dataPtr)
428
- : undefined;
429
- module._free(dataPtr);
430
- return { result, data };
431
- },
432
- nc_get_att_short: (ncid, varid, name, length) => {
433
- const dataPtr = module._malloc(length * 2);
434
- const result = nc_get_att_short_wrapper(ncid, varid, name, dataPtr);
435
- const data = result === NC_CONSTANTS.NC_NOERR
436
- ? Array.from({ length }, (_, i) => module.getValue(dataPtr + i * 2, 'i16'))
437
- : undefined;
438
- module._free(dataPtr);
439
- return { result, data };
440
- },
441
- nc_get_att_int: (ncid, varid, name, length) => {
442
- const dataPtr = module._malloc(length * 4);
443
- const result = nc_get_att_int_wrapper(ncid, varid, name, dataPtr);
444
- const data = result === NC_CONSTANTS.NC_NOERR
445
- ? Array.from({ length }, (_, i) => module.getValue(dataPtr + i * 4, 'i32'))
446
- : undefined;
447
- module._free(dataPtr);
448
- return { result, data };
449
- },
450
- nc_get_att_float: (ncid, varid, name, length) => {
451
- const dataPtr = module._malloc(length * 4);
452
- const result = nc_get_att_float_wrapper(ncid, varid, name, dataPtr);
453
- const data = result === NC_CONSTANTS.NC_NOERR
454
- ? Array.from({ length }, (_, i) => module.getValue(dataPtr + i * 4, 'float'))
455
- : undefined;
456
- module._free(dataPtr);
457
- return { result, data };
458
- },
459
- nc_get_att_double: (ncid, varid, name, length) => {
460
- const dataPtr = module._malloc(length * 8);
461
- const result = nc_get_att_double_wrapper(ncid, varid, name, dataPtr);
462
- const data = result === NC_CONSTANTS.NC_NOERR
463
- ? Array.from({ length }, (_, i) => module.getValue(dataPtr + i * 8, 'double'))
464
- : undefined;
465
- module._free(dataPtr);
466
- return { result, data };
467
- },
468
- nc_get_att_longlong: (ncid, varid, name, length) => {
469
- const dataPtr = module._malloc(length * 8);
470
- const result = nc_get_att_longlong_wrapper(ncid, varid, name, dataPtr);
471
- const data = result === NC_CONSTANTS.NC_NOERR
472
- ? Array.from({ length }, (_, i) => BigInt(module.getValue(dataPtr + i * 8, 'i64')))
473
- : undefined;
474
- module._free(dataPtr);
475
- return { result, data };
476
- },
477
- //---- Variable Getters ----//
478
- nc_get_vara_short: (ncid, varid, start, count) => {
479
- const totalLength = count.reduce((a, b) => a * b, 1);
480
- const dataPtr = module._malloc(totalLength * 2);
481
- const startPtr = module._malloc(start.length * 4);
482
- const countPtr = module._malloc(count.length * 4);
483
- start.forEach((val, i) => module.setValue(startPtr + i * 4, val, 'i32'));
484
- count.forEach((val, i) => module.setValue(countPtr + i * 4, val, 'i32'));
485
- const result = nc_get_vara_short_wrapper(ncid, varid, startPtr, countPtr, dataPtr);
486
- const data = result === NC_CONSTANTS.NC_NOERR
487
- ? new Int16Array(module.HEAP16.buffer, dataPtr, totalLength).slice()
488
- : undefined;
489
- module._free(dataPtr);
490
- module._free(startPtr);
491
- module._free(countPtr);
492
- return { result, data };
493
- },
494
- nc_get_vara_int: (ncid, varid, start, count) => {
495
- const totalLength = count.reduce((a, b) => a * b, 1);
496
- const dataPtr = module._malloc(totalLength * 4);
497
- const startPtr = module._malloc(start.length * 4);
498
- const countPtr = module._malloc(count.length * 4);
499
- start.forEach((val, i) => module.setValue(startPtr + i * 4, val, 'i32'));
500
- count.forEach((val, i) => module.setValue(countPtr + i * 4, val, 'i32'));
501
- const result = nc_get_vara_int_wrapper(ncid, varid, startPtr, countPtr, dataPtr);
502
- const data = result === NC_CONSTANTS.NC_NOERR
503
- ? new Int32Array(module.HEAP32.buffer, dataPtr, totalLength).slice()
504
- : undefined;
505
- module._free(dataPtr);
506
- module._free(startPtr);
507
- module._free(countPtr);
508
- return { result, data };
509
- },
510
- nc_get_vara_float: (ncid, varid, start, count) => {
511
- const totalLength = count.reduce((a, b) => a * b, 1);
512
- const dataPtr = module._malloc(totalLength * 4);
513
- const startPtr = module._malloc(start.length * 4);
514
- const countPtr = module._malloc(count.length * 4);
515
- start.forEach((val, i) => module.setValue(startPtr + i * 4, val, 'i32'));
516
- count.forEach((val, i) => module.setValue(countPtr + i * 4, val, 'i32'));
517
- const result = nc_get_vara_float_wrapper(ncid, varid, startPtr, countPtr, dataPtr);
518
- const data = result === NC_CONSTANTS.NC_NOERR
519
- ? new Float32Array(module.HEAPF32.buffer, dataPtr, totalLength).slice()
520
- : undefined;
521
- module._free(dataPtr);
522
- module._free(startPtr);
523
- module._free(countPtr);
524
- return { result, data };
525
- },
526
- nc_get_vara_double: (ncid, varid, start, count) => {
527
- const totalLength = count.reduce((a, b) => a * b, 1);
528
- const dataPtr = module._malloc(totalLength * 8);
529
- const startPtr = module._malloc(start.length * 4);
530
- const countPtr = module._malloc(count.length * 4);
531
- start.forEach((val, i) => module.setValue(startPtr + i * 4, val, 'i32'));
532
- count.forEach((val, i) => module.setValue(countPtr + i * 4, val, 'i32'));
533
- const result = nc_get_vara_double_wrapper(ncid, varid, startPtr, countPtr, dataPtr);
534
- const data = result === NC_CONSTANTS.NC_NOERR
535
- ? new Float64Array(module.HEAPF64.buffer, dataPtr, totalLength).slice()
536
- : undefined;
537
- module._free(dataPtr);
538
- module._free(startPtr);
539
- module._free(countPtr);
540
- return { result, data };
541
- },
542
- nc_get_vara_longlong: (ncid, varid, start, count) => {
543
- const totalLength = count.reduce((a, b) => a * b, 1);
544
- const dataPtr = module._malloc(totalLength * 8);
545
- const startPtr = module._malloc(start.length * 4);
546
- const countPtr = module._malloc(count.length * 4);
547
- start.forEach((val, i) => module.setValue(startPtr + i * 4, val, 'i32'));
548
- count.forEach((val, i) => module.setValue(countPtr + i * 4, val, 'i32'));
549
- const result = nc_get_vara_longlong_wrapper(ncid, varid, startPtr, countPtr, dataPtr);
550
- const data = result === NC_CONSTANTS.NC_NOERR
551
- ? new BigInt64Array(module.HEAP64.buffer, dataPtr, totalLength).slice()
552
- : undefined;
553
- module._free(dataPtr);
554
- module._free(startPtr);
555
- module._free(countPtr);
556
- return { result, data };
557
- },
558
- nc_get_vara_schar: (ncid, varid, start, count) => {
559
- const totalLength = count.reduce((a, b) => a * b, 1);
560
- const dataPtr = module._malloc(totalLength * 1);
561
- const startPtr = module._malloc(start.length * 4);
562
- const countPtr = module._malloc(count.length * 4);
563
- start.forEach((val, i) => module.setValue(startPtr + i * 4, val, 'i32'));
564
- count.forEach((val, i) => module.setValue(countPtr + i * 4, val, 'i32'));
565
- const result = nc_get_vara_schar_wrapper(ncid, varid, startPtr, countPtr, dataPtr);
566
- const data = result === NC_CONSTANTS.NC_NOERR
567
- ? new Int8Array(module.HEAP8.buffer, dataPtr, totalLength).slice()
568
- : undefined;
569
- module._free(dataPtr);
570
- module._free(startPtr);
571
- module._free(countPtr);
572
- return { result, data };
573
- },
574
- nc_get_vara_uchar: (ncid, varid, start, count) => {
575
- const totalLength = count.reduce((a, b) => a * b, 1);
576
- const dataPtr = module._malloc(totalLength * 1);
577
- const startPtr = module._malloc(start.length * 4);
578
- const countPtr = module._malloc(count.length * 4);
579
- start.forEach((val, i) => module.setValue(startPtr + i * 4, val, 'i32'));
580
- count.forEach((val, i) => module.setValue(countPtr + i * 4, val, 'i32'));
581
- const result = nc_get_vara_uchar_wrapper(ncid, varid, startPtr, countPtr, dataPtr);
582
- const data = result === NC_CONSTANTS.NC_NOERR
583
- ? new Uint8Array(module.HEAPU8.buffer, dataPtr, totalLength).slice()
584
- : undefined;
585
- module._free(dataPtr);
586
- module._free(startPtr);
587
- module._free(countPtr);
588
- return { result, data };
589
- },
590
- nc_get_vara_ushort: (ncid, varid, start, count) => {
591
- const totalLength = count.reduce((a, b) => a * b, 1);
592
- const dataPtr = module._malloc(totalLength * 2);
593
- const startPtr = module._malloc(start.length * 4);
594
- const countPtr = module._malloc(count.length * 4);
595
- start.forEach((val, i) => module.setValue(startPtr + i * 4, val, 'i32'));
596
- count.forEach((val, i) => module.setValue(countPtr + i * 4, val, 'i32'));
597
- const result = nc_get_vara_ushort_wrapper(ncid, varid, startPtr, countPtr, dataPtr);
598
- const data = result === NC_CONSTANTS.NC_NOERR
599
- ? new Uint16Array(module.HEAPU16.buffer, dataPtr, totalLength).slice()
600
- : undefined;
601
- module._free(dataPtr);
602
- module._free(startPtr);
603
- module._free(countPtr);
604
- return { result, data };
605
- },
606
- nc_get_vara_uint: (ncid, varid, start, count) => {
607
- const totalLength = count.reduce((a, b) => a * b, 1);
608
- const dataPtr = module._malloc(totalLength * 4);
609
- const startPtr = module._malloc(start.length * 4);
610
- const countPtr = module._malloc(count.length * 4);
611
- start.forEach((val, i) => module.setValue(startPtr + i * 4, val, 'i32'));
612
- count.forEach((val, i) => module.setValue(countPtr + i * 4, val, 'i32'));
613
- const result = nc_get_vara_uint_wrapper(ncid, varid, startPtr, countPtr, dataPtr);
614
- const data = result === NC_CONSTANTS.NC_NOERR
615
- ? new Uint32Array(module.HEAPU32.buffer, dataPtr, totalLength).slice()
616
- : undefined;
617
- module._free(dataPtr);
618
- module._free(startPtr);
619
- module._free(countPtr);
620
- return { result, data };
621
- },
622
- nc_get_vara_ulonglong: (ncid, varid, start, count) => {
623
- const totalLength = count.reduce((a, b) => a * b, 1);
624
- const dataPtr = module._malloc(totalLength * 8);
625
- const startPtr = module._malloc(start.length * 4);
626
- const countPtr = module._malloc(count.length * 4);
627
- start.forEach((val, i) => module.setValue(startPtr + i * 4, val, 'i32'));
628
- count.forEach((val, i) => module.setValue(countPtr + i * 4, val, 'i32'));
629
- const result = nc_get_vara_ulonglong_wrapper(ncid, varid, startPtr, countPtr, dataPtr);
630
- const data = result === NC_CONSTANTS.NC_NOERR
631
- ? new BigUint64Array(module.HEAP64.buffer, dataPtr, totalLength).slice()
632
- : undefined;
633
- module._free(dataPtr);
634
- module._free(startPtr);
635
- module._free(countPtr);
636
- return { result, data };
637
- },
638
- nc_get_vara_string: (ncid, varid, start, count) => {
639
- const totalLength = count.reduce((a, b) => a * b, 1);
640
- const dataPtr = module._malloc(totalLength * 4);
641
- const startPtr = module._malloc(start.length * 4);
642
- const countPtr = module._malloc(count.length * 4);
643
- start.forEach((val, i) => module.setValue(startPtr + i * 4, val, 'i32'));
644
- count.forEach((val, i) => module.setValue(countPtr + i * 4, val, 'i32'));
645
- const result = nc_get_vara_string_wrapper(ncid, varid, startPtr, countPtr, dataPtr);
646
- let data;
647
- if (result === NC_CONSTANTS.NC_NOERR) {
648
- data = [];
649
- for (let i = 0; i < totalLength; i++) {
650
- const strPtr = module.getValue(dataPtr + i * 4, '*');
651
- data.push(module.UTF8ToString(strPtr));
652
- }
653
- }
654
- module._free(dataPtr);
655
- module._free(startPtr);
656
- module._free(countPtr);
657
- return { result, data };
658
- },
659
- //---- Full Variable Getters ----//
660
- nc_get_var_text: (ncid, varid, length) => {
661
- const dataPtr = module._malloc(length);
662
- const result = nc_get_var_text_wrapper(ncid, varid, dataPtr);
663
- const data = result === NC_CONSTANTS.NC_NOERR
664
- ? [new TextDecoder().decode(module.HEAPU8.subarray(dataPtr, dataPtr + length)).replace(/\0/g, '')]
665
- : undefined;
666
- module._free(dataPtr);
667
- return { result, data };
668
- },
669
- nc_get_var_short: (ncid, varid, length) => {
670
- const dataPtr = module._malloc(length * 2);
671
- const result = nc_get_var_short_wrapper(ncid, varid, dataPtr);
672
- let data;
673
- if (result === NC_CONSTANTS.NC_NOERR) {
674
- // Create a view of the heap and copy it into a new Int16Array
675
- data = new Int16Array(module.HEAP16.buffer, dataPtr, length).slice();
676
- }
677
- module._free(dataPtr);
678
- return { result, data };
679
- },
680
- nc_get_var_int: (ncid, varid, length) => {
681
- const dataPtr = module._malloc(length * 4);
682
- const result = nc_get_var_int_wrapper(ncid, varid, dataPtr);
683
- let data;
684
- if (result === NC_CONSTANTS.NC_NOERR) {
685
- data = new Int32Array(module.HEAP32.buffer, dataPtr, length).slice();
686
- }
687
- module._free(dataPtr);
688
- return { result, data };
689
- },
690
- nc_get_var_float: (ncid, varid, length) => {
691
- const dataPtr = module._malloc(length * 4);
692
- const result = nc_get_var_float_wrapper(ncid, varid, dataPtr);
693
- let data;
694
- if (result === NC_CONSTANTS.NC_NOERR) {
695
- data = new Float32Array(module.HEAPF32.buffer, dataPtr, length).slice();
696
- }
697
- module._free(dataPtr);
698
- return { result, data };
699
- },
700
- nc_get_var_longlong: (ncid, varid, length) => {
701
- const dataPtr = module._malloc(length * 8);
702
- const result = nc_get_var_longlong_wrapper(ncid, varid, dataPtr);
703
- let data;
704
- if (result === NC_CONSTANTS.NC_NOERR) {
705
- // BigInt64Array is used for i64 (long long)
706
- data = new BigInt64Array(module.HEAP64.buffer, dataPtr, length).slice();
707
- }
708
- module._free(dataPtr);
709
- return { result, data };
710
- },
711
- nc_get_var_schar: (ncid, varid, length) => {
712
- const dataPtr = module._malloc(length * 1);
713
- const result = nc_get_var_schar_wrapper(ncid, varid, dataPtr);
714
- let data;
715
- if (result === NC_CONSTANTS.NC_NOERR) {
716
- data = new Int8Array(module.HEAP8.buffer, dataPtr, length).slice();
717
- }
718
- module._free(dataPtr);
719
- return { result, data };
720
- },
721
- nc_get_var_uchar: (ncid, varid, length) => {
722
- const dataPtr = module._malloc(length * 1);
723
- const result = nc_get_var_uchar_wrapper(ncid, varid, dataPtr);
724
- let data;
725
- if (result === NC_CONSTANTS.NC_NOERR) {
726
- data = new Uint8Array(module.HEAPU8.buffer, dataPtr, length).slice();
727
- }
728
- module._free(dataPtr);
729
- return { result, data };
730
- },
731
- nc_get_var_ushort: (ncid, varid, length) => {
732
- const dataPtr = module._malloc(length * 2);
733
- const result = nc_get_var_ushort_wrapper(ncid, varid, dataPtr);
734
- let data;
735
- if (result === NC_CONSTANTS.NC_NOERR) {
736
- data = new Uint16Array(module.HEAPU16.buffer, dataPtr, length).slice();
737
- }
738
- module._free(dataPtr);
739
- return { result, data };
740
- },
741
- nc_get_var_uint: (ncid, varid, length) => {
742
- const dataPtr = module._malloc(length * 4);
743
- const result = nc_get_var_uint_wrapper(ncid, varid, dataPtr);
744
- let data;
745
- if (result === NC_CONSTANTS.NC_NOERR) {
746
- data = new Uint32Array(module.HEAPU32.buffer, dataPtr, length).slice();
747
- }
748
- module._free(dataPtr);
749
- return { result, data };
750
- },
751
- nc_get_var_ulonglong: (ncid, varid, length) => {
752
- const dataPtr = module._malloc(length * 8);
753
- const result = nc_get_var_ulonglong_wrapper(ncid, varid, dataPtr);
754
- let data;
755
- if (result === NC_CONSTANTS.NC_NOERR) {
756
- data = new BigUint64Array(module.HEAP64.buffer, dataPtr, length).slice();
757
- }
758
- module._free(dataPtr);
759
- return { result, data };
760
- },
761
- nc_get_var_string: (ncid, varid, length) => {
762
- const dataPtr = module._malloc(length * 4);
763
- const result = nc_get_var_string_wrapper(ncid, varid, dataPtr);
764
- let data;
765
- if (result === NC_CONSTANTS.NC_NOERR) {
766
- data = [];
767
- for (let i = 0; i < length; i++) {
768
- const strPtr = module.getValue(dataPtr + i * 4, '*');
769
- data.push(module.UTF8ToString(strPtr));
770
- }
771
- }
772
- module._free(dataPtr);
773
- return { result, data };
774
- },
775
- nc_def_dim: (ncid, name, len) => {
776
- const dimidPtr = module._malloc(4);
777
- const result = nc_def_dim_wrapper(ncid, name, len, dimidPtr);
778
- const dimid = module.getValue(dimidPtr, 'i32');
779
- module._free(dimidPtr);
780
- return { result, dimid };
781
- },
782
- nc_def_var: (ncid, name, xtype, ndims, dimids) => {
783
- const varidPtr = module._malloc(4);
784
- const dimidsPtr = module._malloc(dimids.length * 4);
785
- for (let i = 0; i < dimids.length; i++) {
786
- module.setValue(dimidsPtr + i * 4, dimids[i], 'i32');
787
- }
788
- const result = nc_def_var_wrapper(ncid, name, xtype, ndims, dimidsPtr, varidPtr);
789
- const varid = module.getValue(varidPtr, 'i32');
790
- module._free(varidPtr);
791
- module._free(dimidsPtr);
792
- return { result, varid };
793
- },
794
- nc_put_var_double: (ncid, varid, data) => {
795
- const dataPtr = module._malloc(data.length * 8);
796
- module.HEAPF64.set(data, dataPtr / 8);
797
- const result = nc_put_var_double_wrapper(ncid, varid, dataPtr);
798
- module._free(dataPtr);
799
- return result;
800
- },
801
- nc_get_var_double: (ncid, varid, length) => {
802
- const dataPtr = module._malloc(length * 8);
803
- const result = nc_get_var_double_wrapper(ncid, varid, dataPtr);
804
- let data;
805
- if (result === NC_CONSTANTS.NC_NOERR) {
806
- data = new Float64Array(module.HEAPF64.buffer, dataPtr, length).slice();
807
- }
808
- module._free(dataPtr);
809
- return { result, data };
810
- },
811
- nc_enddef: (ncid) => {
812
- return nc_enddef_wrapper(ncid);
813
- },
814
- //---- Group Functions ----//
815
- nc_inq_grps: (ncid) => {
816
- const numgrpsPtr = module._malloc(4);
817
- const grpidsPtr = module._malloc(NC_MAX_VARS * 4); // reuse NC_MAX_VARS as max groups
818
- const result = nc_inq_grps_wrapper(ncid, numgrpsPtr, grpidsPtr);
819
- let numgrps, grpids;
820
- if (result === NC_CONSTANTS.NC_NOERR) {
821
- numgrps = module.getValue(numgrpsPtr, 'i32');
822
- grpids = Int32Array.from({ length: numgrps }, (_, i) => module.getValue(grpidsPtr + (i * 4), 'i32'));
823
- }
824
- module._free(numgrpsPtr);
825
- module._free(grpidsPtr);
826
- return { result, numgrps, grpids };
827
- },
828
- nc_inq_grp_ncid: (ncid, grp_name) => {
829
- const grp_ncidPtr = module._malloc(4);
830
- const result = nc_inq_grp_ncid_wrapper(ncid, grp_name, grp_ncidPtr);
831
- const grp_ncid = result === NC_CONSTANTS.NC_NOERR ? module.getValue(grp_ncidPtr, 'i32') : undefined;
832
- module._free(grp_ncidPtr);
833
- return { result, grp_ncid };
834
- },
835
- nc_inq_grpname: (ncid) => {
836
- const namePtr = module._malloc(NC_MAX_NAME + 1);
837
- const result = nc_inq_grpname_wrapper(ncid, namePtr);
838
- const name = result === NC_CONSTANTS.NC_NOERR ? module.UTF8ToString(namePtr) : undefined;
839
- module._free(namePtr);
840
- return { result, name };
841
- },
842
- nc_inq_grp_parent: (ncid) => {
843
- const parent_ncidPtr = module._malloc(4);
844
- const result = nc_inq_grp_parent_wrapper(ncid, parent_ncidPtr);
845
- const parent_ncid = result === NC_CONSTANTS.NC_NOERR ? module.getValue(parent_ncidPtr, 'i32') : undefined;
846
- module._free(parent_ncidPtr);
847
- return { result, parent_ncid };
848
- },
849
- nc_inq_grp_full_ncid: (ncid, full_name) => {
850
- const grp_ncidPtr = module._malloc(4);
851
- const result = nc_inq_grp_full_ncid_wrapper(ncid, full_name, grp_ncidPtr);
852
- const grp_ncid = result === NC_CONSTANTS.NC_NOERR ? module.getValue(grp_ncidPtr, 'i32') : undefined;
853
- module._free(grp_ncidPtr);
854
- return { result, grp_ncid };
855
- },
856
- nc_inq_grpname_full: (ncid) => {
857
- const maxLen = 1024; // NC_MAX_NAME * path depth estimate
858
- const lenpPtr = module._malloc(8); // size_t
859
- const namePtr = module._malloc(maxLen);
860
- const result = nc_inq_grpname_full_wrapper(ncid, lenpPtr, namePtr);
861
- const full_name = result === NC_CONSTANTS.NC_NOERR ? module.UTF8ToString(namePtr) : undefined;
862
- module._free(lenpPtr);
863
- module._free(namePtr);
864
- return { result, full_name };
865
- },
866
- nc_inq_grpname_len: (ncid) => {
867
- const lenpPtr = module._malloc(8); // size_t
868
- const result = nc_inq_grpname_len_wrapper(ncid, lenpPtr);
869
- const lenp = result === NC_CONSTANTS.NC_NOERR ? module.getValue(lenpPtr, 'i64') : undefined;
870
- module._free(lenpPtr);
871
- return { result, lenp };
872
- },
873
- nc_get_att_string: (ncid, varid, name, length) => {
874
- // allocate space for char*
875
- const ptrArray = module._malloc(length * 4); // pointer array (32bit in wasm)
876
- const result = nc_get_att_string_wrapper(ncid, varid, name, ptrArray);
877
- if (result !== NC_CONSTANTS.NC_NOERR) {
878
- module._free(ptrArray);
879
- return { result, data: undefined };
880
- }
881
- const data = [];
882
- for (let i = 0; i < length; i++) {
883
- const strPtr = module.getValue(ptrArray + i * 4, '*');
884
- data.push(module.UTF8ToString(strPtr));
885
- }
886
- // free strings allocated by netcdf
887
- nc_free_string_wrapper(length, ptrArray);
888
- return { result, data };
889
- },
890
- nc_get_att_uchar: (ncid, varid, name, length) => {
891
- const dataPtr = module._malloc(length);
892
- const result = nc_get_att_uchar_wrapper(ncid, varid, name, dataPtr);
893
- let data;
894
- if (result === NC_CONSTANTS.NC_NOERR) {
895
- data = new Uint8Array(module.HEAPU8.buffer, dataPtr, length).slice();
896
- }
897
- module._free(dataPtr);
898
- return { result, data };
899
- },
900
- nc_get_att_schar: (ncid, varid, name, length) => {
901
- const dataPtr = module._malloc(length);
902
- const result = nc_get_att_schar_wrapper(ncid, varid, name, dataPtr);
903
- let data;
904
- if (result === NC_CONSTANTS.NC_NOERR) {
905
- data = new Int8Array(module.HEAP8.buffer, dataPtr, length).slice();
906
- }
907
- module._free(dataPtr);
908
- return { result, data };
909
- },
910
- // 16-bit unsigned (NC_USHORT)
911
- nc_get_att_ushort: (ncid, varid, name, length) => {
912
- const dataPtr = module._malloc(length * 2);
913
- const result = nc_get_att_ushort_wrapper(ncid, varid, name, dataPtr);
914
- let data;
915
- if (result === NC_CONSTANTS.NC_NOERR) {
916
- data = new Uint16Array(module.HEAPU16.buffer, dataPtr, length).slice();
917
- }
918
- module._free(dataPtr);
919
- return { result, data };
920
- },
921
- // 32-bit unsigned (NC_UINT)
922
- nc_get_att_uint: (ncid, varid, name, length) => {
923
- const dataPtr = module._malloc(length * 4);
924
- const result = nc_get_att_uint_wrapper(ncid, varid, name, dataPtr);
925
- let data;
926
- if (result === NC_CONSTANTS.NC_NOERR) {
927
- data = new Uint32Array(module.HEAPU32.buffer, dataPtr, length).slice();
928
- }
929
- module._free(dataPtr);
930
- return { result, data };
931
- },
932
- // 64-bit unsigned (NC_UINT64 / NC_ULONGLONG)
933
- nc_get_att_ulonglong: (ncid, varid, name, length) => {
934
- const dataPtr = module._malloc(length * 8);
935
- const result = nc_get_att_ulonglong_wrapper(ncid, varid, name, dataPtr);
936
- let data;
937
- if (result === NC_CONSTANTS.NC_NOERR) {
938
- data = new BigUint64Array(module.HEAPU64.buffer, dataPtr, length).slice();
939
- }
940
- module._free(dataPtr);
941
- return { result, data };
942
- },
943
- // Enum Type Functions
944
- nc_inq_typeids: (ncid, maxTypeIds) => {
945
- const ntypesPtr = module._malloc(4);
946
- const typeidsPtr = module._malloc(maxTypeIds * 4);
947
- const result = nc_inq_typeids_wrapper(ncid, ntypesPtr, typeidsPtr);
948
- let ntypes;
949
- let typeids;
950
- if (result === NC_CONSTANTS.NC_NOERR) {
951
- ntypes = module.getValue(ntypesPtr, 'i32');
952
- typeids = [];
953
- for (let i = 0; i < ntypes; i++) {
954
- typeids.push(module.getValue(typeidsPtr + i * 4, 'i32'));
955
- }
956
- }
957
- module._free(ntypesPtr);
958
- module._free(typeidsPtr);
959
- return { result, ntypes, typeids };
960
- },
961
- nc_inq_type: (ncid, xtype) => {
962
- const namePtr = module._malloc(NC_CONSTANTS.NC_MAX_NAME + 1);
963
- const sizePtr = module._malloc(8);
964
- const result = nc_inq_type_wrapper(ncid, xtype, namePtr, sizePtr);
965
- let name;
966
- let size;
967
- if (result === NC_CONSTANTS.NC_NOERR) {
968
- name = module.UTF8ToString(namePtr);
969
- size = Number(module.getValue(sizePtr, 'i64'));
970
- }
971
- module._free(namePtr);
972
- module._free(sizePtr);
973
- return { result, name, size };
974
- },
975
- nc_inq_user_type: (ncid, xtype) => {
976
- const namePtr = module._malloc(NC_CONSTANTS.NC_MAX_NAME + 1);
977
- const sizePtr = module._malloc(8);
978
- const baseTypePtr = module._malloc(4);
979
- const nfieldsPtr = module._malloc(8);
980
- const classPtr = module._malloc(4);
981
- const result = nc_inq_user_type_wrapper(ncid, xtype, namePtr, sizePtr, baseTypePtr, nfieldsPtr, classPtr);
982
- let name;
983
- let size;
984
- let baseType;
985
- let nfields;
986
- let typeClass;
987
- if (result === NC_CONSTANTS.NC_NOERR) {
988
- name = module.UTF8ToString(namePtr);
989
- size = Number(module.getValue(sizePtr, 'i64'));
990
- baseType = module.getValue(baseTypePtr, 'i32');
991
- nfields = Number(module.getValue(nfieldsPtr, 'i64'));
992
- typeClass = module.getValue(classPtr, 'i32');
993
- }
994
- module._free(namePtr);
995
- module._free(sizePtr);
996
- module._free(baseTypePtr);
997
- module._free(nfieldsPtr);
998
- module._free(classPtr);
999
- return { result, name, size, baseType, nfields, typeClass };
1000
- },
1001
- nc_def_enum: (ncid, baseTypeId, name) => {
1002
- const typeidPtr = module._malloc(4);
1003
- const result = nc_def_enum_wrapper(ncid, baseTypeId, name, typeidPtr);
1004
- let typeid;
1005
- if (result === NC_CONSTANTS.NC_NOERR) {
1006
- typeid = module.getValue(typeidPtr, 'i32');
1007
- }
1008
- module._free(typeidPtr);
1009
- return { result, typeid };
1010
- },
1011
- nc_insert_enum: (ncid, xtype, name, value) => {
1012
- const valuePtr = module._malloc(8); // Always allocate 8 bytes (max needed)
1013
- if (typeof value === 'bigint') {
1014
- // Write bigint as 64-bit integer
1015
- const i64Array = new BigInt64Array(module.HEAP8.buffer, valuePtr, 1);
1016
- i64Array[0] = value;
1017
- }
1018
- else {
1019
- // Write number as 32-bit integer (works for byte, short, int, uint)
1020
- module.setValue(valuePtr, value, 'i32');
1021
- }
1022
- const result = nc_insert_enum_wrapper(ncid, xtype, name, valuePtr);
1023
- module._free(valuePtr);
1024
- return { result };
1025
- },
1026
- nc_inq_enum: (ncid, xtype) => {
1027
- const namePtr = module._malloc(NC_CONSTANTS.NC_MAX_NAME + 1);
1028
- const baseTypePtr = module._malloc(4);
1029
- const baseSizePtr = module._malloc(8); // size_t can be 8 bytes
1030
- const numMembersPtr = module._malloc(8); // size_t can be 8 bytes
1031
- const result = nc_inq_enum_wrapper(ncid, xtype, namePtr, baseTypePtr, baseSizePtr, numMembersPtr);
1032
- let name;
1033
- let baseType;
1034
- let baseSize;
1035
- let numMembers;
1036
- if (result === NC_CONSTANTS.NC_NOERR) {
1037
- name = module.UTF8ToString(namePtr);
1038
- baseType = module.getValue(baseTypePtr, 'i32');
1039
- // Try reading as 32-bit size_t first
1040
- baseSize = Number(module.getValue(baseSizePtr, 'i32'));
1041
- numMembers = Number(module.getValue(numMembersPtr, 'i32'));
1042
- }
1043
- module._free(namePtr);
1044
- module._free(baseTypePtr);
1045
- module._free(baseSizePtr);
1046
- module._free(numMembersPtr);
1047
- return { result, name, baseType, baseSize, numMembers };
1048
- },
1049
- nc_inq_enum_member: (ncid, xtype, idx, baseType) => {
1050
- const namePtr = module._malloc(NC_CONSTANTS.NC_MAX_NAME + 1);
1051
- const valuePtr = module._malloc(8);
1052
- const result = nc_inq_enum_member_wrapper(ncid, xtype, idx, namePtr, valuePtr);
1053
- let name;
1054
- let value;
1055
- if (result === NC_CONSTANTS.NC_NOERR) {
1056
- name = module.UTF8ToString(namePtr);
1057
- // Read value based on base type
1058
- switch (baseType) {
1059
- case NC_CONSTANTS.NC_BYTE:
1060
- value = module.getValue(valuePtr, 'i8');
1061
- break;
1062
- case NC_CONSTANTS.NC_UBYTE:
1063
- value = module.getValue(valuePtr, 'i8') & 0xFF;
1064
- break;
1065
- case NC_CONSTANTS.NC_SHORT:
1066
- value = module.getValue(valuePtr, 'i16');
1067
- break;
1068
- case NC_CONSTANTS.NC_USHORT:
1069
- value = module.getValue(valuePtr, 'i16') & 0xFFFF;
1070
- break;
1071
- case NC_CONSTANTS.NC_INT:
1072
- value = module.getValue(valuePtr, 'i32');
1073
- break;
1074
- case NC_CONSTANTS.NC_UINT:
1075
- value = module.getValue(valuePtr, 'i32') >>> 0;
1076
- break;
1077
- case NC_CONSTANTS.NC_INT64:
1078
- value = module.getValue(valuePtr, 'i64');
1079
- break;
1080
- case NC_CONSTANTS.NC_UINT64:
1081
- value = module.getValue(valuePtr, 'i64');
1082
- break;
1083
- default:
1084
- value = module.getValue(valuePtr, 'i32');
1085
- }
1086
- }
1087
- module._free(namePtr);
1088
- module._free(valuePtr);
1089
- return { result, name, value };
1090
- },
1091
- nc_inq_enum_ident: (ncid, xtype, value) => {
1092
- const identPtr = module._malloc(NC_CONSTANTS.NC_MAX_NAME + 1);
1093
- const numValue = typeof value === 'bigint' ? Number(value) : value;
1094
- const result = nc_inq_enum_ident_wrapper(ncid, xtype, numValue, identPtr);
1095
- let identifier;
1096
- if (result === NC_CONSTANTS.NC_NOERR) {
1097
- identifier = module.UTF8ToString(identPtr);
1098
- }
1099
- module._free(identPtr);
1100
- return { result, identifier };
1101
- },
1102
- // generic nc_get_var function to module
1103
- nc_get_var_generic: (ncid, varid, length, nctype) => {
1104
- const elementSize = DATA_TYPE_SIZE[nctype];
1105
- const dataPtr = module._malloc(length * elementSize);
1106
- const result = nc_get_var_wrapper(ncid, varid, dataPtr);
1107
- let data;
1108
- if (result === NC_CONSTANTS.NC_NOERR) {
1109
- switch (nctype) {
1110
- case NC_CONSTANTS.NC_BYTE:
1111
- data = new Int8Array(module.HEAP8.buffer, dataPtr, length).slice();
1112
- break;
1113
- case NC_CONSTANTS.NC_UBYTE:
1114
- data = new Uint8Array(module.HEAPU8.buffer, dataPtr, length).slice();
1115
- break;
1116
- case NC_CONSTANTS.NC_SHORT:
1117
- data = new Int16Array(module.HEAP16.buffer, dataPtr, length).slice();
1118
- break;
1119
- case NC_CONSTANTS.NC_USHORT:
1120
- data = new Uint16Array(module.HEAPU16.buffer, dataPtr, length).slice();
1121
- break;
1122
- case NC_CONSTANTS.NC_INT:
1123
- data = new Int32Array(module.HEAP32.buffer, dataPtr, length).slice();
1124
- break;
1125
- case NC_CONSTANTS.NC_UINT:
1126
- data = new Uint32Array(module.HEAPU32.buffer, dataPtr, length).slice();
1127
- break;
1128
- case NC_CONSTANTS.NC_INT64:
1129
- data = new BigInt64Array(module.HEAP64.buffer, dataPtr, length).slice();
1130
- break;
1131
- case NC_CONSTANTS.NC_UINT64:
1132
- data = new BigUint64Array(module.HEAPU64.buffer, dataPtr, length).slice();
1133
- break;
1134
- }
1135
- }
1136
- module._free(dataPtr);
1137
- return { result, data };
1138
- },
1139
- nc_get_vara_generic: (ncid, varid, start, count, nctype) => {
1140
- const elementSize = DATA_TYPE_SIZE[nctype];
1141
- const totalLength = count.reduce((a, b) => a * b, 1);
1142
- const dataPtr = module._malloc(totalLength * elementSize);
1143
- const startPtr = module._malloc(start.length * 4);
1144
- const countPtr = module._malloc(count.length * 4);
1145
- start.forEach((val, i) => module.setValue(startPtr + i * 4, val, 'i32'));
1146
- count.forEach((val, i) => module.setValue(countPtr + i * 4, val, 'i32'));
1147
- const result = nc_get_vara_wrapper(ncid, varid, startPtr, countPtr, dataPtr);
1148
- let data;
1149
- if (result === NC_CONSTANTS.NC_NOERR) {
1150
- switch (nctype) {
1151
- case NC_CONSTANTS.NC_BYTE:
1152
- data = new Int8Array(module.HEAP8.buffer, dataPtr, totalLength).slice();
1153
- break;
1154
- case NC_CONSTANTS.NC_UBYTE:
1155
- data = new Uint8Array(module.HEAPU8.buffer, dataPtr, totalLength).slice();
1156
- break;
1157
- case NC_CONSTANTS.NC_SHORT:
1158
- data = new Int16Array(module.HEAP16.buffer, dataPtr, totalLength).slice();
1159
- break;
1160
- case NC_CONSTANTS.NC_USHORT:
1161
- data = new Uint16Array(module.HEAPU16.buffer, dataPtr, totalLength).slice();
1162
- break;
1163
- case NC_CONSTANTS.NC_INT:
1164
- data = new Int32Array(module.HEAP32.buffer, dataPtr, totalLength).slice();
1165
- break;
1166
- case NC_CONSTANTS.NC_UINT:
1167
- data = new Uint32Array(module.HEAPU32.buffer, dataPtr, totalLength).slice();
1168
- break;
1169
- case NC_CONSTANTS.NC_INT64:
1170
- data = new BigInt64Array(module.HEAP64.buffer, dataPtr, totalLength).slice();
1171
- break;
1172
- case NC_CONSTANTS.NC_UINT64:
1173
- data = new BigUint64Array(module.HEAPU64.buffer, dataPtr, totalLength).slice();
1174
- break;
1175
- }
1176
- }
1177
- module._free(dataPtr);
1178
- module._free(startPtr);
1179
- module._free(countPtr);
1180
- return { result, data };
1181
- },
1182
- // start/count/stride → i32 / 4 bytes per element (size_t and ptrdiff_t are 4 bytes in wasm32)
1183
- nc_get_vars_schar: (ncid, varid, start, count, stride) => {
1184
- const totalLength = stridedLength(count);
1185
- const dataPtr = module._malloc(safeByteLength(totalLength, 1));
1186
- const startPtr = module._malloc(start.length * 4);
1187
- const countPtr = module._malloc(count.length * 4);
1188
- const stridePtr = module._malloc(stride.length * 4);
1189
- start.forEach((v, i) => module.setValue(startPtr + i * 4, v, 'i32'));
1190
- count.forEach((v, i) => module.setValue(countPtr + i * 4, v, 'i32'));
1191
- stride.forEach((v, i) => module.setValue(stridePtr + i * 4, v, 'i32'));
1192
- const result = nc_get_vars_schar_wrapper(ncid, varid, startPtr, countPtr, stridePtr, dataPtr);
1193
- const data = result === NC_CONSTANTS.NC_NOERR
1194
- ? new Int8Array(module.HEAP8.buffer, dataPtr, totalLength).slice()
1195
- : undefined;
1196
- module._free(dataPtr);
1197
- module._free(startPtr);
1198
- module._free(countPtr);
1199
- module._free(stridePtr);
1200
- return { result, data };
1201
- },
1202
- nc_get_vars_uchar: (ncid, varid, start, count, stride) => {
1203
- const totalLength = stridedLength(count);
1204
- const dataPtr = module._malloc(safeByteLength(totalLength, 1));
1205
- const startPtr = module._malloc(start.length * 4);
1206
- const countPtr = module._malloc(count.length * 4);
1207
- const stridePtr = module._malloc(stride.length * 4);
1208
- start.forEach((v, i) => module.setValue(startPtr + i * 4, v, 'i32'));
1209
- count.forEach((v, i) => module.setValue(countPtr + i * 4, v, 'i32'));
1210
- stride.forEach((v, i) => module.setValue(stridePtr + i * 4, v, 'i32'));
1211
- const result = nc_get_vars_uchar_wrapper(ncid, varid, startPtr, countPtr, stridePtr, dataPtr);
1212
- const data = result === NC_CONSTANTS.NC_NOERR
1213
- ? new Uint8Array(module.HEAPU8.buffer, dataPtr, totalLength).slice()
1214
- : undefined;
1215
- module._free(dataPtr);
1216
- module._free(startPtr);
1217
- module._free(countPtr);
1218
- module._free(stridePtr);
1219
- return { result, data };
1220
- },
1221
- nc_get_vars_short: (ncid, varid, start, count, stride) => {
1222
- const totalLength = stridedLength(count);
1223
- const dataPtr = module._malloc(safeByteLength(totalLength, 2));
1224
- const startPtr = module._malloc(start.length * 4);
1225
- const countPtr = module._malloc(count.length * 4);
1226
- const stridePtr = module._malloc(stride.length * 4);
1227
- start.forEach((v, i) => module.setValue(startPtr + i * 4, v, 'i32'));
1228
- count.forEach((v, i) => module.setValue(countPtr + i * 4, v, 'i32'));
1229
- stride.forEach((v, i) => module.setValue(stridePtr + i * 4, v, 'i32'));
1230
- const result = nc_get_vars_short_wrapper(ncid, varid, startPtr, countPtr, stridePtr, dataPtr);
1231
- const data = result === NC_CONSTANTS.NC_NOERR
1232
- ? new Int16Array(module.HEAP16.buffer, dataPtr, totalLength).slice()
1233
- : undefined;
1234
- module._free(dataPtr);
1235
- module._free(startPtr);
1236
- module._free(countPtr);
1237
- module._free(stridePtr);
1238
- return { result, data };
1239
- },
1240
- nc_get_vars_ushort: (ncid, varid, start, count, stride) => {
1241
- const totalLength = stridedLength(count);
1242
- const dataPtr = module._malloc(safeByteLength(totalLength, 2));
1243
- const startPtr = module._malloc(start.length * 4);
1244
- const countPtr = module._malloc(count.length * 4);
1245
- const stridePtr = module._malloc(stride.length * 4);
1246
- start.forEach((v, i) => module.setValue(startPtr + i * 4, v, 'i32'));
1247
- count.forEach((v, i) => module.setValue(countPtr + i * 4, v, 'i32'));
1248
- stride.forEach((v, i) => module.setValue(stridePtr + i * 4, v, 'i32'));
1249
- const result = nc_get_vars_ushort_wrapper(ncid, varid, startPtr, countPtr, stridePtr, dataPtr);
1250
- const data = result === NC_CONSTANTS.NC_NOERR
1251
- ? new Uint16Array(module.HEAPU16.buffer, dataPtr, totalLength).slice()
1252
- : undefined;
1253
- module._free(dataPtr);
1254
- module._free(startPtr);
1255
- module._free(countPtr);
1256
- module._free(stridePtr);
1257
- return { result, data };
1258
- },
1259
- nc_get_vars_int: (ncid, varid, start, count, stride) => {
1260
- const totalLength = stridedLength(count);
1261
- const dataPtr = module._malloc(safeByteLength(totalLength, 4));
1262
- const startPtr = module._malloc(start.length * 4);
1263
- const countPtr = module._malloc(count.length * 4);
1264
- const stridePtr = module._malloc(stride.length * 4);
1265
- start.forEach((v, i) => module.setValue(startPtr + i * 4, v, 'i32'));
1266
- count.forEach((v, i) => module.setValue(countPtr + i * 4, v, 'i32'));
1267
- stride.forEach((v, i) => module.setValue(stridePtr + i * 4, v, 'i32'));
1268
- const result = nc_get_vars_int_wrapper(ncid, varid, startPtr, countPtr, stridePtr, dataPtr);
1269
- const data = result === NC_CONSTANTS.NC_NOERR
1270
- ? new Int32Array(module.HEAP32.buffer, dataPtr, totalLength).slice()
1271
- : undefined;
1272
- module._free(dataPtr);
1273
- module._free(startPtr);
1274
- module._free(countPtr);
1275
- module._free(stridePtr);
1276
- return { result, data };
1277
- },
1278
- nc_get_vars_uint: (ncid, varid, start, count, stride) => {
1279
- const totalLength = stridedLength(count);
1280
- const dataPtr = module._malloc(safeByteLength(totalLength, 4));
1281
- const startPtr = module._malloc(start.length * 4);
1282
- const countPtr = module._malloc(count.length * 4);
1283
- const stridePtr = module._malloc(stride.length * 4);
1284
- start.forEach((v, i) => module.setValue(startPtr + i * 4, v, 'i32'));
1285
- count.forEach((v, i) => module.setValue(countPtr + i * 4, v, 'i32'));
1286
- stride.forEach((v, i) => module.setValue(stridePtr + i * 4, v, 'i32'));
1287
- const result = nc_get_vars_uint_wrapper(ncid, varid, startPtr, countPtr, stridePtr, dataPtr);
1288
- const data = result === NC_CONSTANTS.NC_NOERR
1289
- ? new Uint32Array(module.HEAPU32.buffer, dataPtr, totalLength).slice()
1290
- : undefined;
1291
- module._free(dataPtr);
1292
- module._free(startPtr);
1293
- module._free(countPtr);
1294
- module._free(stridePtr);
1295
- return { result, data };
1296
- },
1297
- nc_get_vars_float: (ncid, varid, start, count, stride) => {
1298
- const totalLength = stridedLength(count);
1299
- const dataPtr = module._malloc(safeByteLength(totalLength, 4));
1300
- const startPtr = module._malloc(start.length * 4);
1301
- const countPtr = module._malloc(count.length * 4);
1302
- const stridePtr = module._malloc(stride.length * 4);
1303
- start.forEach((v, i) => module.setValue(startPtr + i * 4, v, 'i32'));
1304
- count.forEach((v, i) => module.setValue(countPtr + i * 4, v, 'i32'));
1305
- stride.forEach((v, i) => module.setValue(stridePtr + i * 4, v, 'i32'));
1306
- const result = nc_get_vars_float_wrapper(ncid, varid, startPtr, countPtr, stridePtr, dataPtr);
1307
- const data = result === NC_CONSTANTS.NC_NOERR
1308
- ? new Float32Array(module.HEAPF32.buffer, dataPtr, totalLength).slice()
1309
- : undefined;
1310
- module._free(dataPtr);
1311
- module._free(startPtr);
1312
- module._free(countPtr);
1313
- module._free(stridePtr);
1314
- return { result, data };
1315
- },
1316
- nc_get_vars_double: (ncid, varid, start, count, stride) => {
1317
- const totalLength = stridedLength(count);
1318
- const dataPtr = module._malloc(safeByteLength(totalLength, 8));
1319
- const startPtr = module._malloc(start.length * 4);
1320
- const countPtr = module._malloc(count.length * 4);
1321
- const stridePtr = module._malloc(stride.length * 4);
1322
- start.forEach((v, i) => module.setValue(startPtr + i * 4, v, 'i32'));
1323
- count.forEach((v, i) => module.setValue(countPtr + i * 4, v, 'i32'));
1324
- stride.forEach((v, i) => module.setValue(stridePtr + i * 4, v, 'i32'));
1325
- const result = nc_get_vars_double_wrapper(ncid, varid, startPtr, countPtr, stridePtr, dataPtr);
1326
- const data = result === NC_CONSTANTS.NC_NOERR
1327
- ? new Float64Array(module.HEAPF64.buffer, dataPtr, totalLength).slice()
1328
- : undefined;
1329
- module._free(dataPtr);
1330
- module._free(startPtr);
1331
- module._free(countPtr);
1332
- module._free(stridePtr);
1333
- return { result, data };
1334
- },
1335
- nc_get_vars_longlong: (ncid, varid, start, count, stride) => {
1336
- const totalLength = stridedLength(count);
1337
- const dataPtr = module._malloc(safeByteLength(totalLength, 8));
1338
- const startPtr = module._malloc(start.length * 4);
1339
- const countPtr = module._malloc(count.length * 4);
1340
- const stridePtr = module._malloc(stride.length * 4);
1341
- start.forEach((v, i) => module.setValue(startPtr + i * 4, v, 'i32'));
1342
- count.forEach((v, i) => module.setValue(countPtr + i * 4, v, 'i32'));
1343
- stride.forEach((v, i) => module.setValue(stridePtr + i * 4, v, 'i32'));
1344
- const result = nc_get_vars_longlong_wrapper(ncid, varid, startPtr, countPtr, stridePtr, dataPtr);
1345
- const data = result === NC_CONSTANTS.NC_NOERR
1346
- ? new BigInt64Array(module.HEAP64.buffer, dataPtr, totalLength).slice()
1347
- : undefined;
1348
- module._free(dataPtr);
1349
- module._free(startPtr);
1350
- module._free(countPtr);
1351
- module._free(stridePtr);
1352
- return { result, data };
1353
- },
1354
- nc_get_vars_ulonglong: (ncid, varid, start, count, stride) => {
1355
- const totalLength = stridedLength(count);
1356
- const dataPtr = module._malloc(safeByteLength(totalLength, 8));
1357
- const startPtr = module._malloc(start.length * 4);
1358
- const countPtr = module._malloc(count.length * 4);
1359
- const stridePtr = module._malloc(stride.length * 4);
1360
- start.forEach((v, i) => module.setValue(startPtr + i * 4, v, 'i32'));
1361
- count.forEach((v, i) => module.setValue(countPtr + i * 4, v, 'i32'));
1362
- stride.forEach((v, i) => module.setValue(stridePtr + i * 4, v, 'i32'));
1363
- const result = nc_get_vars_ulonglong_wrapper(ncid, varid, startPtr, countPtr, stridePtr, dataPtr);
1364
- const data = result === NC_CONSTANTS.NC_NOERR
1365
- ? new BigUint64Array(module.HEAPU64.buffer, dataPtr, totalLength).slice()
1366
- : undefined;
1367
- module._free(dataPtr);
1368
- module._free(startPtr);
1369
- module._free(countPtr);
1370
- module._free(stridePtr);
1371
- return { result, data };
1372
- },
1373
- nc_get_vars_string: (ncid, varid, start, count, stride) => {
1374
- const totalLength = stridedLength(count);
1375
- // validate allocation size won't overflow WASM32 uint32.
1376
- // char* pointers are 4 bytes in wasm32, so elementSize = 4.
1377
- const dataPtr = module._malloc(safeByteLength(totalLength, 4));
1378
- const startPtr = module._malloc(start.length * 4);
1379
- const countPtr = module._malloc(count.length * 4);
1380
- const stridePtr = module._malloc(stride.length * 4);
1381
- start.forEach((v, i) => module.setValue(startPtr + i * 4, v, 'i32'));
1382
- count.forEach((v, i) => module.setValue(countPtr + i * 4, v, 'i32'));
1383
- stride.forEach((v, i) => module.setValue(stridePtr + i * 4, v, 'i32'));
1384
- const result = nc_get_vars_string_wrapper(ncid, varid, startPtr, countPtr, stridePtr, dataPtr);
1385
- let data;
1386
- if (result === NC_CONSTANTS.NC_NOERR) {
1387
- data = [];
1388
- for (let i = 0; i < totalLength; i++) {
1389
- const strPtr = module.getValue(dataPtr + i * 4, '*');
1390
- data.push(module.UTF8ToString(strPtr));
1391
- }
1392
- // free the individual strings allocated by NetCDF-C before
1393
- // freeing the pointer array. nc_free_string_wrapper handles both.
1394
- nc_free_string_wrapper(totalLength, dataPtr);
1395
- }
1396
- else {
1397
- module._free(dataPtr);
1398
- }
1399
- module._free(startPtr);
1400
- module._free(countPtr);
1401
- module._free(stridePtr);
1402
- return { result, data };
1403
- },
1404
- nc_get_vars_generic: (ncid, varid, start, count, stride, nctype) => {
1405
- const elementSize = DATA_TYPE_SIZE[nctype];
1406
- const totalLength = stridedLength(count);
1407
- const startPtr = module._malloc(start.length * 4);
1408
- const countPtr = module._malloc(count.length * 4);
1409
- const stridePtr = module._malloc(stride.length * 4);
1410
- start.forEach((v, i) => module.setValue(startPtr + i * 4, v, 'i32'));
1411
- count.forEach((v, i) => module.setValue(countPtr + i * 4, v, 'i32'));
1412
- stride.forEach((v, i) => module.setValue(stridePtr + i * 4, v, 'i32'));
1413
- if (nctype === NC_CONSTANTS.NC_STRING) {
1414
- // validate allocation size won't overflow WASM32 uint32.
1415
- const dataPtr = module._malloc(safeByteLength(totalLength, 4));
1416
- const result = nc_get_vars_string_wrapper(ncid, varid, startPtr, countPtr, stridePtr, dataPtr);
1417
- let data;
1418
- if (result === NC_CONSTANTS.NC_NOERR) {
1419
- data = [];
1420
- for (let i = 0; i < totalLength; i++) {
1421
- const strPtr = module.getValue(dataPtr + i * 4, '*');
1422
- data.push(module.UTF8ToString(strPtr));
1423
- }
1424
- // free the individual strings allocated by NetCDF-C before
1425
- // freeing the pointer array. nc_free_string_wrapper handles both.
1426
- nc_free_string_wrapper(totalLength, dataPtr);
1427
- }
1428
- else {
1429
- module._free(dataPtr);
1430
- }
1431
- module._free(startPtr);
1432
- module._free(countPtr);
1433
- module._free(stridePtr);
1434
- return { result, data };
1435
- }
1436
- // validate allocation size won't overflow WASM32 uint32.
1437
- const dataPtr = module._malloc(safeByteLength(totalLength, elementSize));
1438
- const result = nc_get_vars_wrapper(ncid, varid, startPtr, countPtr, stridePtr, dataPtr);
1439
- let data;
1440
- if (result === NC_CONSTANTS.NC_NOERR) {
1441
- switch (nctype) {
1442
- case NC_CONSTANTS.NC_BYTE:
1443
- data = new Int8Array(module.HEAP8.buffer, dataPtr, totalLength).slice();
1444
- break;
1445
- case NC_CONSTANTS.NC_UBYTE:
1446
- data = new Uint8Array(module.HEAPU8.buffer, dataPtr, totalLength).slice();
1447
- break;
1448
- case NC_CONSTANTS.NC_SHORT:
1449
- data = new Int16Array(module.HEAP16.buffer, dataPtr, totalLength).slice();
1450
- break;
1451
- case NC_CONSTANTS.NC_USHORT:
1452
- data = new Uint16Array(module.HEAPU16.buffer, dataPtr, totalLength).slice();
1453
- break;
1454
- case NC_CONSTANTS.NC_INT:
1455
- data = new Int32Array(module.HEAP32.buffer, dataPtr, totalLength).slice();
1456
- break;
1457
- case NC_CONSTANTS.NC_UINT:
1458
- data = new Uint32Array(module.HEAPU32.buffer, dataPtr, totalLength).slice();
1459
- break;
1460
- case NC_CONSTANTS.NC_FLOAT:
1461
- data = new Float32Array(module.HEAPF32.buffer, dataPtr, totalLength).slice();
1462
- break;
1463
- case NC_CONSTANTS.NC_DOUBLE:
1464
- data = new Float64Array(module.HEAPF64.buffer, dataPtr, totalLength).slice();
1465
- break;
1466
- case NC_CONSTANTS.NC_INT64:
1467
- data = new BigInt64Array(module.HEAP64.buffer, dataPtr, totalLength).slice();
1468
- break;
1469
- case NC_CONSTANTS.NC_UINT64:
1470
- data = new BigUint64Array(module.HEAPU64.buffer, dataPtr, totalLength).slice();
1471
- break;
1472
- }
1473
- }
1474
- module._free(dataPtr);
1475
- module._free(startPtr);
1476
- module._free(countPtr);
1477
- module._free(stridePtr);
1478
- return { result, data };
1479
- },
1480
- nc_get_vars_text: (ncid, varid, start, count, stride) => {
1481
- const totalLength = stridedLength(count);
1482
- const dataPtr = module._malloc(safeByteLength(totalLength, 1));
1483
- const startPtr = module._malloc(start.length * 4);
1484
- const countPtr = module._malloc(count.length * 4);
1485
- const stridePtr = module._malloc(stride.length * 4);
1486
- start.forEach((v, i) => module.setValue(startPtr + i * 4, v, 'i32'));
1487
- count.forEach((v, i) => module.setValue(countPtr + i * 4, v, 'i32'));
1488
- stride.forEach((v, i) => module.setValue(stridePtr + i * 4, v, 'i32'));
1489
- const result = nc_get_vars_text_wrapper(ncid, varid, startPtr, countPtr, stridePtr, dataPtr);
1490
- const data = result === NC_CONSTANTS.NC_NOERR
1491
- ? Array.from(new TextDecoder().decode(module.HEAPU8.subarray(dataPtr, dataPtr + totalLength)), char => char === '\0' ? '' : char)
1492
- : undefined;
1493
- module._free(dataPtr);
1494
- module._free(startPtr);
1495
- module._free(countPtr);
1496
- module._free(stridePtr);
1497
- return { result, data };
1498
- },
1499
- };
1500
- }
1501
- }
1502
- //# sourceMappingURL=wasm-module.js.map