diff --git a/package.json b/package.json index 9307593..300394b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "solar-spa", - "version": "1.2.1", + "version": "1.2.2", "description": "NREL Solar Position Algorithm (SPA) in WebAssembly", "main": "solar-spa.js", "types": "index.d.ts", diff --git a/solar-spa.js b/solar-spa.js index a59ccde..985d45a 100644 --- a/solar-spa.js +++ b/solar-spa.js @@ -1,6 +1,11 @@ -// solar-spa.js const spaModule = require('./spa.js'); +let isRuntimeInitialized = false; + +spaModule.onRuntimeInitialized = function () { + isRuntimeInitialized = true; +}; + module.exports = function spa( date, latitude, @@ -10,53 +15,56 @@ module.exports = function spa( pressure = 1013.25, refraction = 0.5667 ) { - return new Promise((resolve) => { - spaModule.onRuntimeInitialized = function () { - const spa_calculate = spaModule.cwrap( - 'spa_calculate_wrapper', - 'number', - [ - 'number', 'number', 'number', 'number', 'number', - 'number', 'number', 'number', 'number', 'number', - 'number', 'number', 'number', 'number', 'number' - ] - ); + return new Promise((resolve, reject) => { + if (!isRuntimeInitialized) { + reject(new Error('Emscripten runtime is not initialized.')); + return; + } - const spa_free_result = spaModule.cwrap( - 'spa_free_result', - null, - ['number'] - ); + const spa_calculate = spaModule.cwrap( + 'spa_calculate_wrapper', + 'number', + [ + 'number', 'number', 'number', 'number', 'number', + 'number', 'number', 'number', 'number', 'number', + 'number', 'number', 'number', 'number', 'number' + ] + ); - const year = date.getFullYear(); - const month = date.getMonth() + 1; - const day = date.getDate(); - const hour = date.getHours(); - const minute = date.getMinutes(); - const second = date.getSeconds(); - const timezone = -date.getTimezoneOffset() / 60; - const slope = 0; - const azm_rotation = 0; + const spa_free_result = spaModule.cwrap( + 'spa_free_result', + null, + ['number'] + ); - const resultPtr = spa_calculate( - year, month, day, hour, minute, second, timezone, - latitude, longitude, elevation, pressure, temperature, - slope, azm_rotation, refraction - ); + const year = date.getFullYear(); + const month = date.getMonth() + 1; + const day = date.getDate(); + const hour = date.getHours(); + const minute = date.getMinutes(); + const second = date.getSeconds(); + const timezone = -date.getTimezoneOffset() / 60; + const slope = 0; + const azm_rotation = 0; - const result = { - zenith: spaModule.getValue(resultPtr, 'double'), - azimuth: spaModule.getValue(resultPtr + 8, 'double'), - incidence: spaModule.getValue(resultPtr + 16, 'double'), - sunrise: spaModule.getValue(resultPtr + 24, 'double'), - sunset: spaModule.getValue(resultPtr + 32, 'double'), - solar_noon: spaModule.getValue(resultPtr + 40, 'double'), - sun_transit_alt: spaModule.getValue(resultPtr + 48, 'double'), - }; + const resultPtr = spa_calculate( + year, month, day, hour, minute, second, timezone, + latitude, longitude, elevation, pressure, temperature, + slope, azm_rotation, refraction + ); - spa_free_result(resultPtr); - - resolve(result); + const result = { + zenith: spaModule.getValue(resultPtr, 'double'), + azimuth: spaModule.getValue(resultPtr + 8, 'double'), + incidence: spaModule.getValue(resultPtr + 16, 'double'), + sunrise: spaModule.getValue(resultPtr + 24, 'double'), + sunset: spaModule.getValue(resultPtr + 32, 'double'), + solar_noon: spaModule.getValue(resultPtr + 40, 'double'), + sun_transit_alt: spaModule.getValue(resultPtr + 48, 'double'), }; + + spa_free_result(resultPtr); + + resolve(result); }); };