├── .gitignore ├── .npmignore ├── LICENSE ├── README.md ├── app.js ├── converter ├── LICENSE.md ├── README.md ├── bin │ ├── grib2json │ └── grib2json.cmd ├── demo │ ├── gfs.t12z.pgrb2.1p00.f000 │ └── out.json ├── lib │ ├── c3p0-0.9.1.1.jar │ ├── commons-codec-1.2.jar │ ├── commons-httpclient-3.1.jar │ ├── ehcache-core-2.6.2.jar │ ├── grib-4.3.19.jar │ ├── grib2json-0.8.0-SNAPSHOT.jar │ ├── javax.json-1.0.3.jar │ ├── jcip-annotations-1.0.jar │ ├── jcl-over-slf4j-1.7.5.jar │ ├── jdom2-2.0.4.jar │ ├── je-4.0.92.jar │ ├── jewelcli-0.8.8.jar │ ├── jna-3.0.9.jar │ ├── joda-time-2.3.jar │ ├── jsoup-1.7.2.jar │ ├── logback-classic-1.0.9.jar │ ├── logback-core-1.0.9.jar │ ├── netcdf-4.3.19.jar │ ├── protobuf-java-2.5.0.jar │ ├── quartz-2.1.1.jar │ ├── slf4j-api-1.7.5.jar │ └── udunits-4.3.19.jar └── out.json ├── package-lock.json └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | node_modules 3 | grib-data 4 | json-data -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | wind-archive.zip 2 | grib-data 3 | json-data -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2013 Cameron Beccario 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- 24 | 25 | The MIT License (MIT) 26 | 27 | Copyright (c) 2016 Daniel Wild 28 | 29 | Permission is hereby granted, free of charge, to any person obtaining a copy 30 | of this software and associated documentation files (the "Software"), to deal 31 | in the Software without restriction, including without limitation the rights 32 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 33 | copies of the Software, and to permit persons to whom the Software is 34 | furnished to do so, subject to the following conditions: 35 | 36 | The above copyright notice and this permission notice shall be included in 37 | all copies or substantial portions of the Software. 38 | 39 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 40 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 41 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 42 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 43 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 44 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 45 | THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # wind-js-server [![NPM version][npm-image]][npm-url] [![NPM Downloads][npm-downloads-image]][npm-url] 2 | 3 | Simple demo rest service to expose [GRIB2](http://en.wikipedia.org/wiki/GRIB) wind forecast data 4 | (1 degree, 6 hourly from [NOAA](http://nomads.ncep.noaa.gov/)) as JSON.
5 | 6 | Consumed in [leaflet-velocity](https://github.com/danwild/leaflet-velocity). 7 | Contains a pre-packaged copy of [grib2json](https://github.com/cambecc/grib2json) for conversion. 8 | 9 | Data Vis demo here: http://danwild.github.io/leaflet-velocity 10 | 11 | Note that this is intended as a crude demonstration, not intended for production use. 12 | To get to production; you should improve upon this or build your own. 13 | 14 | ## install, run: 15 | 16 | (assumes you have node and npm installed) 17 | 18 | ```bash 19 | # from project root: 20 | npm install 21 | npm start 22 | ``` 23 | 24 | ## endpoints 25 | - **/latest** returns the most up to date JSON data available 26 | - **/nearest** returns JSON data nearest to requested 27 | - $GET params: 28 | - `timeIso` an ISO timestamp for temporal target 29 | - `searchLimit` number of days to search beyond the timeIso (will search backwards, then forwards) 30 | - **/alive** health check url, returns simple message 31 | 32 | ## License 33 | MIT License (MIT) 34 | 35 | [npm-image]: https://badge.fury.io/js/wind-js-server.svg 36 | [npm-url]: https://www.npmjs.com/package/wind-js-server 37 | [npm-downloads-image]: https://img.shields.io/npm/dt/wind-js-server.svg -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | var express = require("express"); 2 | var moment = require("moment"); 3 | var http = require('http'); 4 | var request = require('request'); 5 | var fs = require('fs'); 6 | var Q = require('q'); 7 | var cors = require('cors'); 8 | 9 | var app = express(); 10 | var port = process.env.PORT || 7000; 11 | var baseDir ='http://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_1p00.pl'; 12 | 13 | // cors config 14 | var whitelist = [ 15 | 'http://localhost:63342', 16 | 'http://localhost:3000', 17 | 'http://localhost:4000', 18 | 'http://danwild.github.io' 19 | ]; 20 | 21 | var corsOptions = { 22 | origin: function(origin, callback){ 23 | var originIsWhitelisted = whitelist.indexOf(origin) !== -1; 24 | callback(null, originIsWhitelisted); 25 | } 26 | }; 27 | 28 | app.listen(port, function(err){ 29 | console.log("running server on port "+ port); 30 | }); 31 | 32 | app.get('/', cors(corsOptions), function(req, res){ 33 | res.send('hello wind-js-server.. go to /latest for wind data..'); 34 | }); 35 | 36 | app.get('/alive', cors(corsOptions), function(req, res){ 37 | res.send('wind-js-server is alive'); 38 | }); 39 | 40 | app.get('/latest', cors(corsOptions), function(req, res){ 41 | 42 | /** 43 | * Find and return the latest available 6 hourly pre-parsed JSON data 44 | * 45 | * @param targetMoment {Object} UTC moment 46 | */ 47 | function sendLatest(targetMoment){ 48 | 49 | var stamp = moment(targetMoment).format('YYYYMMDD') + roundHours(moment(targetMoment).hour(), 6); 50 | var fileName = __dirname +"/json-data/"+ stamp +".json"; 51 | 52 | res.setHeader('Content-Type', 'application/json'); 53 | res.sendFile(fileName, {}, function (err) { 54 | if (err) { 55 | console.log(stamp +' doesnt exist yet, trying previous interval..'); 56 | sendLatest(moment(targetMoment).subtract(6, 'hours')); 57 | } 58 | }); 59 | } 60 | 61 | sendLatest(moment().utc()); 62 | 63 | }); 64 | 65 | app.get('/nearest', cors(corsOptions), function(req, res, next){ 66 | 67 | var time = req.query.timeIso; 68 | var limit = req.query.searchLimit; 69 | var searchForwards = false; 70 | 71 | /** 72 | * Find and return the nearest available 6 hourly pre-parsed JSON data 73 | * If limit provided, searches backwards to limit, then forwards to limit before failing. 74 | * 75 | * @param targetMoment {Object} UTC moment 76 | */ 77 | function sendNearestTo(targetMoment){ 78 | 79 | if( limit && Math.abs( moment.utc(time).diff(targetMoment, 'days')) >= limit) { 80 | if(!searchForwards){ 81 | searchForwards = true; 82 | sendNearestTo(moment(targetMoment).add(limit, 'days')); 83 | return; 84 | } 85 | else { 86 | return next(new Error('No data within searchLimit')); 87 | } 88 | } 89 | 90 | var stamp = moment(targetMoment).format('YYYYMMDD') + roundHours(moment(targetMoment).hour(), 6); 91 | var fileName = __dirname +"/json-data/"+ stamp +".json"; 92 | 93 | res.setHeader('Content-Type', 'application/json'); 94 | res.sendFile(fileName, {}, function (err) { 95 | if(err) { 96 | var nextTarget = searchForwards ? moment(targetMoment).add(6, 'hours') : moment(targetMoment).subtract(6, 'hours'); 97 | sendNearestTo(nextTarget); 98 | } 99 | }); 100 | } 101 | 102 | if(time && moment(time).isValid()){ 103 | sendNearestTo(moment.utc(time)); 104 | } 105 | else { 106 | return next(new Error('Invalid params, expecting: timeIso=ISO_TIME_STRING')); 107 | } 108 | 109 | }); 110 | 111 | /** 112 | * 113 | * Ping for new data every 15 mins 114 | * 115 | */ 116 | setInterval(function(){ 117 | 118 | run(moment.utc()); 119 | 120 | }, 900000); 121 | 122 | /** 123 | * 124 | * @param targetMoment {Object} moment to check for new data 125 | */ 126 | function run(targetMoment){ 127 | 128 | getGribData(targetMoment).then(function(response){ 129 | if(response.stamp){ 130 | convertGribToJson(response.stamp, response.targetMoment); 131 | } 132 | }); 133 | } 134 | 135 | /** 136 | * 137 | * Finds and returns the latest 6 hourly GRIB2 data from NOAAA 138 | * 139 | * @returns {*|promise} 140 | */ 141 | function getGribData(targetMoment){ 142 | 143 | var deferred = Q.defer(); 144 | 145 | function runQuery(targetMoment){ 146 | 147 | // only go 2 weeks deep 148 | if (moment.utc().diff(targetMoment, 'days') > 30){ 149 | console.log('hit limit, harvest complete or there is a big gap in data..'); 150 | return; 151 | } 152 | 153 | var stamp = moment(targetMoment).format('YYYYMMDD') + roundHours(moment(targetMoment).hour(), 6); 154 | request.get({ 155 | url: baseDir, 156 | qs: { 157 | file: 'gfs.t'+ roundHours(moment(targetMoment).hour(), 6) +'z.pgrb2.1p00.f000', 158 | lev_10_m_above_ground: 'on', 159 | lev_surface: 'on', 160 | var_TMP: 'on', 161 | var_UGRD: 'on', 162 | var_VGRD: 'on', 163 | leftlon: 0, 164 | rightlon: 360, 165 | toplat: 90, 166 | bottomlat: -90, 167 | dir: '/gfs.'+stamp 168 | } 169 | 170 | }).on('error', function(err){ 171 | // console.log(err); 172 | runQuery(moment(targetMoment).subtract(6, 'hours')); 173 | 174 | }).on('response', function(response) { 175 | 176 | console.log('response '+response.statusCode + ' | '+stamp); 177 | 178 | if(response.statusCode != 200){ 179 | runQuery(moment(targetMoment).subtract(6, 'hours')); 180 | } 181 | 182 | else { 183 | // don't rewrite stamps 184 | if(!checkPath('json-data/'+ stamp +'.json', false)) { 185 | 186 | console.log('piping ' + stamp); 187 | 188 | // mk sure we've got somewhere to put output 189 | checkPath('grib-data', true); 190 | 191 | // pipe the file, resolve the valid time stamp 192 | var file = fs.createWriteStream("grib-data/"+stamp+".f000"); 193 | response.pipe(file); 194 | file.on('finish', function() { 195 | file.close(); 196 | deferred.resolve({stamp: stamp, targetMoment: targetMoment}); 197 | }); 198 | 199 | } 200 | else { 201 | console.log('already have '+ stamp +', not looking further'); 202 | deferred.resolve({stamp: false, targetMoment: false}); 203 | } 204 | } 205 | }); 206 | 207 | } 208 | 209 | runQuery(targetMoment); 210 | return deferred.promise; 211 | } 212 | 213 | function convertGribToJson(stamp, targetMoment){ 214 | 215 | // mk sure we've got somewhere to put output 216 | checkPath('json-data', true); 217 | 218 | var exec = require('child_process').exec, child; 219 | 220 | child = exec('converter/bin/grib2json --data --output json-data/'+stamp+'.json --names --compact grib-data/'+stamp+'.f000', 221 | {maxBuffer: 500*1024}, 222 | function (error, stdout, stderr){ 223 | 224 | if(error){ 225 | console.log('exec error: ' + error); 226 | } 227 | 228 | else { 229 | console.log("converted.."); 230 | 231 | // don't keep raw grib data 232 | exec('rm grib-data/*'); 233 | 234 | // if we don't have older stamp, try and harvest one 235 | var prevMoment = moment(targetMoment).subtract(6, 'hours'); 236 | var prevStamp = prevMoment.format('YYYYMMDD') + roundHours(prevMoment.hour(), 6); 237 | 238 | if(!checkPath('json-data/'+ prevStamp +'.json', false)){ 239 | 240 | console.log("attempting to harvest older data "+ stamp); 241 | run(prevMoment); 242 | } 243 | 244 | else { 245 | console.log('got older, no need to harvest further'); 246 | } 247 | } 248 | }); 249 | } 250 | 251 | /** 252 | * 253 | * Round hours to expected interval, e.g. we're currently using 6 hourly interval 254 | * i.e. 00 || 06 || 12 || 18 255 | * 256 | * @param hours 257 | * @param interval 258 | * @returns {String} 259 | */ 260 | function roundHours(hours, interval){ 261 | if(interval > 0){ 262 | var result = (Math.floor(hours / interval) * interval); 263 | return result < 10 ? '0' + result.toString() : result; 264 | } 265 | } 266 | 267 | /** 268 | * Sync check if path or file exists 269 | * 270 | * @param path {string} 271 | * @param mkdir {boolean} create dir if doesn't exist 272 | * @returns {boolean} 273 | */ 274 | function checkPath(path, mkdir) { 275 | try { 276 | fs.statSync(path); 277 | return true; 278 | 279 | } catch(e) { 280 | if(mkdir){ 281 | fs.mkdirSync(path); 282 | } 283 | return false; 284 | } 285 | } 286 | 287 | // init harvest 288 | run(moment.utc()); -------------------------------------------------------------------------------- /converter/LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2013 Cameron Beccario 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /converter/README.md: -------------------------------------------------------------------------------- 1 | grib2json 2 | ========= 3 | 4 | A command line utility that decodes [GRIB2](http://en.wikipedia.org/wiki/GRIB) files as JSON. 5 | 6 | This utility uses the netCDF-Java GRIB decoder, part of the [THREDDS](https://github.com/Unidata/thredds) project 7 | by University Corporation for Atmospheric Research/Unidata. 8 | 9 | Installation 10 | ------------ 11 | 12 | ``` 13 | git clone 14 | mvn package 15 | ``` 16 | 17 | This creates a .tar.gz in the target directory. Unzip and untar the package in a location of choice. 18 | 19 | Usage 20 | ----- 21 | 22 | The `grib2json` launch script is located in the `bin` directory and requires the `JAVA_HOME` environment 23 | variable to be defined. 24 | 25 | ``` 26 | > grib2json --help 27 | Usage: grib2json [options] FILE 28 | [--compact -c] : enable compact Json formatting 29 | [--data -d] : print GRIB record data 30 | [--filter.category --fc value] : select records with this numeric category 31 | [--filter.parameter --fp value] : select records with this numeric parameter 32 | [--filter.surface --fs value] : select records with this numeric surface type 33 | [--filter.value --fv value] : select records with this numeric surface value 34 | [--help -h] : display this help 35 | [--names -n] : print names of numeric codes 36 | [--output -o value] : write output to the specified file (default is stdout) 37 | [--verbose -v] : enable logging to stdout 38 | ``` 39 | 40 | For example, the following command outputs to stdout the records for parameter 2 (U-component_of_wind), with 41 | surface type 103 (Specified height level above ground), and surface value 10.0 meters from the GRIB2 file 42 | _gfs.t18z.pgrbf00.2p5deg.grib2_. Notice the optional inclusion of human-readable _xyzName_ keys and the data array: 43 | 44 | ``` 45 | > grib2json --names --data --fp 2 --fs 103 --fv 10.0 gfs.t18z.pgrbf00.2p5deg.grib2 46 | 47 | [ 48 | { 49 | "header":{ 50 | "discipline":0, 51 | "disciplineName":"Meteorological products", 52 | "gribEdition":2, 53 | "gribLength":27759, 54 | "center":7, 55 | "centerName":"US National Weather Service - NCEP(WMC)", 56 | "parameterNumber":2, 57 | "parameterNumberName":"U-component_of_wind", 58 | "parameterUnit":"m.s-1", 59 | "surface1Type":103, 60 | "surface1TypeName":"Specified height level above ground", 61 | "surface1Value":10.0, 62 | ... 63 | }, 64 | "data":[ 65 | -2.12, 66 | -2.27, 67 | -2.41, 68 | ... 69 | ] 70 | } 71 | ] 72 | ``` 73 | -------------------------------------------------------------------------------- /converter/bin/grib2json: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | #set -x 3 | LIB_DIR=$(dirname "$0")/../lib 4 | LAUNCH_JAR=$LIB_DIR/grib2json-*.jar 5 | $JAVA_HOME/bin/java -Xmx512M -jar $LAUNCH_JAR $@ 6 | -------------------------------------------------------------------------------- /converter/bin/grib2json.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | set LIB_DIR="%~dp0..\lib" 3 | for /f "delims=X" %%i in ('dir /b %LIB_DIR%\grib2json-*.jar') do set LAUNCH_JAR=%LIB_DIR%\%%i 4 | "%JAVA_HOME%\bin\java.exe" -Xmx512M -jar %LAUNCH_JAR% %* 5 | -------------------------------------------------------------------------------- /converter/demo/gfs.t12z.pgrb2.1p00.f000: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danwild/wind-js-server/2b57af513748b91cf3f70c53d79c0bf4b356ef07/converter/demo/gfs.t12z.pgrb2.1p00.f000 -------------------------------------------------------------------------------- /converter/lib/c3p0-0.9.1.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danwild/wind-js-server/2b57af513748b91cf3f70c53d79c0bf4b356ef07/converter/lib/c3p0-0.9.1.1.jar -------------------------------------------------------------------------------- /converter/lib/commons-codec-1.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danwild/wind-js-server/2b57af513748b91cf3f70c53d79c0bf4b356ef07/converter/lib/commons-codec-1.2.jar -------------------------------------------------------------------------------- /converter/lib/commons-httpclient-3.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danwild/wind-js-server/2b57af513748b91cf3f70c53d79c0bf4b356ef07/converter/lib/commons-httpclient-3.1.jar -------------------------------------------------------------------------------- /converter/lib/ehcache-core-2.6.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danwild/wind-js-server/2b57af513748b91cf3f70c53d79c0bf4b356ef07/converter/lib/ehcache-core-2.6.2.jar -------------------------------------------------------------------------------- /converter/lib/grib-4.3.19.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danwild/wind-js-server/2b57af513748b91cf3f70c53d79c0bf4b356ef07/converter/lib/grib-4.3.19.jar -------------------------------------------------------------------------------- /converter/lib/grib2json-0.8.0-SNAPSHOT.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danwild/wind-js-server/2b57af513748b91cf3f70c53d79c0bf4b356ef07/converter/lib/grib2json-0.8.0-SNAPSHOT.jar -------------------------------------------------------------------------------- /converter/lib/javax.json-1.0.3.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danwild/wind-js-server/2b57af513748b91cf3f70c53d79c0bf4b356ef07/converter/lib/javax.json-1.0.3.jar -------------------------------------------------------------------------------- /converter/lib/jcip-annotations-1.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danwild/wind-js-server/2b57af513748b91cf3f70c53d79c0bf4b356ef07/converter/lib/jcip-annotations-1.0.jar -------------------------------------------------------------------------------- /converter/lib/jcl-over-slf4j-1.7.5.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danwild/wind-js-server/2b57af513748b91cf3f70c53d79c0bf4b356ef07/converter/lib/jcl-over-slf4j-1.7.5.jar -------------------------------------------------------------------------------- /converter/lib/jdom2-2.0.4.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danwild/wind-js-server/2b57af513748b91cf3f70c53d79c0bf4b356ef07/converter/lib/jdom2-2.0.4.jar -------------------------------------------------------------------------------- /converter/lib/je-4.0.92.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danwild/wind-js-server/2b57af513748b91cf3f70c53d79c0bf4b356ef07/converter/lib/je-4.0.92.jar -------------------------------------------------------------------------------- /converter/lib/jewelcli-0.8.8.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danwild/wind-js-server/2b57af513748b91cf3f70c53d79c0bf4b356ef07/converter/lib/jewelcli-0.8.8.jar -------------------------------------------------------------------------------- /converter/lib/jna-3.0.9.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danwild/wind-js-server/2b57af513748b91cf3f70c53d79c0bf4b356ef07/converter/lib/jna-3.0.9.jar -------------------------------------------------------------------------------- /converter/lib/joda-time-2.3.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danwild/wind-js-server/2b57af513748b91cf3f70c53d79c0bf4b356ef07/converter/lib/joda-time-2.3.jar -------------------------------------------------------------------------------- /converter/lib/jsoup-1.7.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danwild/wind-js-server/2b57af513748b91cf3f70c53d79c0bf4b356ef07/converter/lib/jsoup-1.7.2.jar -------------------------------------------------------------------------------- /converter/lib/logback-classic-1.0.9.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danwild/wind-js-server/2b57af513748b91cf3f70c53d79c0bf4b356ef07/converter/lib/logback-classic-1.0.9.jar -------------------------------------------------------------------------------- /converter/lib/logback-core-1.0.9.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danwild/wind-js-server/2b57af513748b91cf3f70c53d79c0bf4b356ef07/converter/lib/logback-core-1.0.9.jar -------------------------------------------------------------------------------- /converter/lib/netcdf-4.3.19.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danwild/wind-js-server/2b57af513748b91cf3f70c53d79c0bf4b356ef07/converter/lib/netcdf-4.3.19.jar -------------------------------------------------------------------------------- /converter/lib/protobuf-java-2.5.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danwild/wind-js-server/2b57af513748b91cf3f70c53d79c0bf4b356ef07/converter/lib/protobuf-java-2.5.0.jar -------------------------------------------------------------------------------- /converter/lib/quartz-2.1.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danwild/wind-js-server/2b57af513748b91cf3f70c53d79c0bf4b356ef07/converter/lib/quartz-2.1.1.jar -------------------------------------------------------------------------------- /converter/lib/slf4j-api-1.7.5.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danwild/wind-js-server/2b57af513748b91cf3f70c53d79c0bf4b356ef07/converter/lib/slf4j-api-1.7.5.jar -------------------------------------------------------------------------------- /converter/lib/udunits-4.3.19.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danwild/wind-js-server/2b57af513748b91cf3f70c53d79c0bf4b356ef07/converter/lib/udunits-4.3.19.jar -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "wind-js-server", 3 | "version": "0.0.2", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "accepts": { 8 | "version": "1.3.5", 9 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 10 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 11 | "requires": { 12 | "mime-types": "~2.1.18", 13 | "negotiator": "0.6.1" 14 | } 15 | }, 16 | "ajv": { 17 | "version": "5.5.2", 18 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", 19 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", 20 | "requires": { 21 | "co": "^4.6.0", 22 | "fast-deep-equal": "^1.0.0", 23 | "fast-json-stable-stringify": "^2.0.0", 24 | "json-schema-traverse": "^0.3.0" 25 | } 26 | }, 27 | "array-flatten": { 28 | "version": "1.1.1", 29 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 30 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 31 | }, 32 | "asn1": { 33 | "version": "0.2.3", 34 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", 35 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" 36 | }, 37 | "assert-plus": { 38 | "version": "1.0.0", 39 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 40 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 41 | }, 42 | "asynckit": { 43 | "version": "0.4.0", 44 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 45 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 46 | }, 47 | "aws-sign2": { 48 | "version": "0.7.0", 49 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 50 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 51 | }, 52 | "aws4": { 53 | "version": "1.7.0", 54 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", 55 | "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" 56 | }, 57 | "bcrypt-pbkdf": { 58 | "version": "1.0.2", 59 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 60 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 61 | "optional": true, 62 | "requires": { 63 | "tweetnacl": "^0.14.3" 64 | } 65 | }, 66 | "body-parser": { 67 | "version": "1.18.2", 68 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", 69 | "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", 70 | "requires": { 71 | "bytes": "3.0.0", 72 | "content-type": "~1.0.4", 73 | "debug": "2.6.9", 74 | "depd": "~1.1.1", 75 | "http-errors": "~1.6.2", 76 | "iconv-lite": "0.4.19", 77 | "on-finished": "~2.3.0", 78 | "qs": "6.5.1", 79 | "raw-body": "2.3.2", 80 | "type-is": "~1.6.15" 81 | } 82 | }, 83 | "bytes": { 84 | "version": "3.0.0", 85 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 86 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 87 | }, 88 | "caseless": { 89 | "version": "0.12.0", 90 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 91 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 92 | }, 93 | "co": { 94 | "version": "4.6.0", 95 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 96 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" 97 | }, 98 | "combined-stream": { 99 | "version": "1.0.6", 100 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", 101 | "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", 102 | "requires": { 103 | "delayed-stream": "~1.0.0" 104 | } 105 | }, 106 | "content-disposition": { 107 | "version": "0.5.2", 108 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 109 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 110 | }, 111 | "content-type": { 112 | "version": "1.0.4", 113 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 114 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 115 | }, 116 | "cookie": { 117 | "version": "0.3.1", 118 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 119 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 120 | }, 121 | "cookie-signature": { 122 | "version": "1.0.6", 123 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 124 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 125 | }, 126 | "core-util-is": { 127 | "version": "1.0.2", 128 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 129 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 130 | }, 131 | "cors": { 132 | "version": "2.8.4", 133 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", 134 | "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", 135 | "requires": { 136 | "object-assign": "^4", 137 | "vary": "^1" 138 | } 139 | }, 140 | "dashdash": { 141 | "version": "1.14.1", 142 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 143 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 144 | "requires": { 145 | "assert-plus": "^1.0.0" 146 | } 147 | }, 148 | "debug": { 149 | "version": "2.6.9", 150 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 151 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 152 | "requires": { 153 | "ms": "2.0.0" 154 | } 155 | }, 156 | "delayed-stream": { 157 | "version": "1.0.0", 158 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 159 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 160 | }, 161 | "depd": { 162 | "version": "1.1.2", 163 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 164 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 165 | }, 166 | "destroy": { 167 | "version": "1.0.4", 168 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 169 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 170 | }, 171 | "ecc-jsbn": { 172 | "version": "0.1.1", 173 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", 174 | "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", 175 | "optional": true, 176 | "requires": { 177 | "jsbn": "~0.1.0" 178 | } 179 | }, 180 | "ee-first": { 181 | "version": "1.1.1", 182 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 183 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 184 | }, 185 | "encodeurl": { 186 | "version": "1.0.2", 187 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 188 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 189 | }, 190 | "escape-html": { 191 | "version": "1.0.3", 192 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 193 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 194 | }, 195 | "etag": { 196 | "version": "1.8.1", 197 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 198 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 199 | }, 200 | "express": { 201 | "version": "4.16.3", 202 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", 203 | "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", 204 | "requires": { 205 | "accepts": "~1.3.5", 206 | "array-flatten": "1.1.1", 207 | "body-parser": "1.18.2", 208 | "content-disposition": "0.5.2", 209 | "content-type": "~1.0.4", 210 | "cookie": "0.3.1", 211 | "cookie-signature": "1.0.6", 212 | "debug": "2.6.9", 213 | "depd": "~1.1.2", 214 | "encodeurl": "~1.0.2", 215 | "escape-html": "~1.0.3", 216 | "etag": "~1.8.1", 217 | "finalhandler": "1.1.1", 218 | "fresh": "0.5.2", 219 | "merge-descriptors": "1.0.1", 220 | "methods": "~1.1.2", 221 | "on-finished": "~2.3.0", 222 | "parseurl": "~1.3.2", 223 | "path-to-regexp": "0.1.7", 224 | "proxy-addr": "~2.0.3", 225 | "qs": "6.5.1", 226 | "range-parser": "~1.2.0", 227 | "safe-buffer": "5.1.1", 228 | "send": "0.16.2", 229 | "serve-static": "1.13.2", 230 | "setprototypeof": "1.1.0", 231 | "statuses": "~1.4.0", 232 | "type-is": "~1.6.16", 233 | "utils-merge": "1.0.1", 234 | "vary": "~1.1.2" 235 | } 236 | }, 237 | "extend": { 238 | "version": "3.0.1", 239 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", 240 | "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" 241 | }, 242 | "extsprintf": { 243 | "version": "1.3.0", 244 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 245 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 246 | }, 247 | "fast-deep-equal": { 248 | "version": "1.1.0", 249 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", 250 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" 251 | }, 252 | "fast-json-stable-stringify": { 253 | "version": "2.0.0", 254 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 255 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 256 | }, 257 | "finalhandler": { 258 | "version": "1.1.1", 259 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 260 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 261 | "requires": { 262 | "debug": "2.6.9", 263 | "encodeurl": "~1.0.2", 264 | "escape-html": "~1.0.3", 265 | "on-finished": "~2.3.0", 266 | "parseurl": "~1.3.2", 267 | "statuses": "~1.4.0", 268 | "unpipe": "~1.0.0" 269 | } 270 | }, 271 | "forever-agent": { 272 | "version": "0.6.1", 273 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 274 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 275 | }, 276 | "form-data": { 277 | "version": "2.3.2", 278 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", 279 | "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", 280 | "requires": { 281 | "asynckit": "^0.4.0", 282 | "combined-stream": "1.0.6", 283 | "mime-types": "^2.1.12" 284 | } 285 | }, 286 | "forwarded": { 287 | "version": "0.1.2", 288 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 289 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 290 | }, 291 | "fresh": { 292 | "version": "0.5.2", 293 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 294 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 295 | }, 296 | "getpass": { 297 | "version": "0.1.7", 298 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 299 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 300 | "requires": { 301 | "assert-plus": "^1.0.0" 302 | } 303 | }, 304 | "har-schema": { 305 | "version": "2.0.0", 306 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 307 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 308 | }, 309 | "har-validator": { 310 | "version": "5.0.3", 311 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", 312 | "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", 313 | "requires": { 314 | "ajv": "^5.1.0", 315 | "har-schema": "^2.0.0" 316 | } 317 | }, 318 | "http-errors": { 319 | "version": "1.6.3", 320 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 321 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 322 | "requires": { 323 | "depd": "~1.1.2", 324 | "inherits": "2.0.3", 325 | "setprototypeof": "1.1.0", 326 | "statuses": ">= 1.4.0 < 2" 327 | } 328 | }, 329 | "http-signature": { 330 | "version": "1.2.0", 331 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 332 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 333 | "requires": { 334 | "assert-plus": "^1.0.0", 335 | "jsprim": "^1.2.2", 336 | "sshpk": "^1.7.0" 337 | } 338 | }, 339 | "iconv-lite": { 340 | "version": "0.4.19", 341 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", 342 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" 343 | }, 344 | "inherits": { 345 | "version": "2.0.3", 346 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 347 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 348 | }, 349 | "ipaddr.js": { 350 | "version": "1.6.0", 351 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", 352 | "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=" 353 | }, 354 | "is-typedarray": { 355 | "version": "1.0.0", 356 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 357 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 358 | }, 359 | "isstream": { 360 | "version": "0.1.2", 361 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 362 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 363 | }, 364 | "jsbn": { 365 | "version": "0.1.1", 366 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 367 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 368 | "optional": true 369 | }, 370 | "json-schema": { 371 | "version": "0.2.3", 372 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 373 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 374 | }, 375 | "json-schema-traverse": { 376 | "version": "0.3.1", 377 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 378 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" 379 | }, 380 | "json-stringify-safe": { 381 | "version": "5.0.1", 382 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 383 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 384 | }, 385 | "jsprim": { 386 | "version": "1.4.1", 387 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 388 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 389 | "requires": { 390 | "assert-plus": "1.0.0", 391 | "extsprintf": "1.3.0", 392 | "json-schema": "0.2.3", 393 | "verror": "1.10.0" 394 | } 395 | }, 396 | "media-typer": { 397 | "version": "0.3.0", 398 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 399 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 400 | }, 401 | "merge-descriptors": { 402 | "version": "1.0.1", 403 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 404 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 405 | }, 406 | "methods": { 407 | "version": "1.1.2", 408 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 409 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 410 | }, 411 | "mime": { 412 | "version": "1.4.1", 413 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 414 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 415 | }, 416 | "mime-db": { 417 | "version": "1.33.0", 418 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", 419 | "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" 420 | }, 421 | "mime-types": { 422 | "version": "2.1.18", 423 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", 424 | "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", 425 | "requires": { 426 | "mime-db": "~1.33.0" 427 | } 428 | }, 429 | "moment": { 430 | "version": "2.22.2", 431 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", 432 | "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" 433 | }, 434 | "ms": { 435 | "version": "2.0.0", 436 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 437 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 438 | }, 439 | "negotiator": { 440 | "version": "0.6.1", 441 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 442 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 443 | }, 444 | "oauth-sign": { 445 | "version": "0.8.2", 446 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", 447 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" 448 | }, 449 | "object-assign": { 450 | "version": "4.1.1", 451 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 452 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 453 | }, 454 | "on-finished": { 455 | "version": "2.3.0", 456 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 457 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 458 | "requires": { 459 | "ee-first": "1.1.1" 460 | } 461 | }, 462 | "parseurl": { 463 | "version": "1.3.2", 464 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 465 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 466 | }, 467 | "path-to-regexp": { 468 | "version": "0.1.7", 469 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 470 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 471 | }, 472 | "performance-now": { 473 | "version": "2.1.0", 474 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 475 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 476 | }, 477 | "proxy-addr": { 478 | "version": "2.0.3", 479 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", 480 | "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", 481 | "requires": { 482 | "forwarded": "~0.1.2", 483 | "ipaddr.js": "1.6.0" 484 | } 485 | }, 486 | "punycode": { 487 | "version": "1.4.1", 488 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 489 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 490 | }, 491 | "q": { 492 | "version": "1.5.1", 493 | "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", 494 | "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" 495 | }, 496 | "qs": { 497 | "version": "6.5.1", 498 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", 499 | "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" 500 | }, 501 | "range-parser": { 502 | "version": "1.2.0", 503 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 504 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 505 | }, 506 | "raw-body": { 507 | "version": "2.3.2", 508 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", 509 | "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", 510 | "requires": { 511 | "bytes": "3.0.0", 512 | "http-errors": "1.6.2", 513 | "iconv-lite": "0.4.19", 514 | "unpipe": "1.0.0" 515 | }, 516 | "dependencies": { 517 | "depd": { 518 | "version": "1.1.1", 519 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", 520 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" 521 | }, 522 | "http-errors": { 523 | "version": "1.6.2", 524 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", 525 | "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", 526 | "requires": { 527 | "depd": "1.1.1", 528 | "inherits": "2.0.3", 529 | "setprototypeof": "1.0.3", 530 | "statuses": ">= 1.3.1 < 2" 531 | } 532 | }, 533 | "setprototypeof": { 534 | "version": "1.0.3", 535 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", 536 | "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" 537 | } 538 | } 539 | }, 540 | "request": { 541 | "version": "2.87.0", 542 | "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", 543 | "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", 544 | "requires": { 545 | "aws-sign2": "~0.7.0", 546 | "aws4": "^1.6.0", 547 | "caseless": "~0.12.0", 548 | "combined-stream": "~1.0.5", 549 | "extend": "~3.0.1", 550 | "forever-agent": "~0.6.1", 551 | "form-data": "~2.3.1", 552 | "har-validator": "~5.0.3", 553 | "http-signature": "~1.2.0", 554 | "is-typedarray": "~1.0.0", 555 | "isstream": "~0.1.2", 556 | "json-stringify-safe": "~5.0.1", 557 | "mime-types": "~2.1.17", 558 | "oauth-sign": "~0.8.2", 559 | "performance-now": "^2.1.0", 560 | "qs": "~6.5.1", 561 | "safe-buffer": "^5.1.1", 562 | "tough-cookie": "~2.3.3", 563 | "tunnel-agent": "^0.6.0", 564 | "uuid": "^3.1.0" 565 | } 566 | }, 567 | "safe-buffer": { 568 | "version": "5.1.1", 569 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 570 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 571 | }, 572 | "safer-buffer": { 573 | "version": "2.1.2", 574 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 575 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 576 | }, 577 | "send": { 578 | "version": "0.16.2", 579 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 580 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 581 | "requires": { 582 | "debug": "2.6.9", 583 | "depd": "~1.1.2", 584 | "destroy": "~1.0.4", 585 | "encodeurl": "~1.0.2", 586 | "escape-html": "~1.0.3", 587 | "etag": "~1.8.1", 588 | "fresh": "0.5.2", 589 | "http-errors": "~1.6.2", 590 | "mime": "1.4.1", 591 | "ms": "2.0.0", 592 | "on-finished": "~2.3.0", 593 | "range-parser": "~1.2.0", 594 | "statuses": "~1.4.0" 595 | } 596 | }, 597 | "serve-static": { 598 | "version": "1.13.2", 599 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 600 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 601 | "requires": { 602 | "encodeurl": "~1.0.2", 603 | "escape-html": "~1.0.3", 604 | "parseurl": "~1.3.2", 605 | "send": "0.16.2" 606 | } 607 | }, 608 | "setprototypeof": { 609 | "version": "1.1.0", 610 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 611 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 612 | }, 613 | "sshpk": { 614 | "version": "1.14.2", 615 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", 616 | "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", 617 | "requires": { 618 | "asn1": "~0.2.3", 619 | "assert-plus": "^1.0.0", 620 | "bcrypt-pbkdf": "^1.0.0", 621 | "dashdash": "^1.12.0", 622 | "ecc-jsbn": "~0.1.1", 623 | "getpass": "^0.1.1", 624 | "jsbn": "~0.1.0", 625 | "safer-buffer": "^2.0.2", 626 | "tweetnacl": "~0.14.0" 627 | } 628 | }, 629 | "statuses": { 630 | "version": "1.4.0", 631 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 632 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 633 | }, 634 | "tough-cookie": { 635 | "version": "2.3.4", 636 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", 637 | "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", 638 | "requires": { 639 | "punycode": "^1.4.1" 640 | } 641 | }, 642 | "tunnel-agent": { 643 | "version": "0.6.0", 644 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 645 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 646 | "requires": { 647 | "safe-buffer": "^5.0.1" 648 | } 649 | }, 650 | "tweetnacl": { 651 | "version": "0.14.5", 652 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 653 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 654 | "optional": true 655 | }, 656 | "type-is": { 657 | "version": "1.6.16", 658 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 659 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 660 | "requires": { 661 | "media-typer": "0.3.0", 662 | "mime-types": "~2.1.18" 663 | } 664 | }, 665 | "unpipe": { 666 | "version": "1.0.0", 667 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 668 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 669 | }, 670 | "utils-merge": { 671 | "version": "1.0.1", 672 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 673 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 674 | }, 675 | "uuid": { 676 | "version": "3.3.2", 677 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 678 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" 679 | }, 680 | "vary": { 681 | "version": "1.1.2", 682 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 683 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 684 | }, 685 | "verror": { 686 | "version": "1.10.0", 687 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 688 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 689 | "requires": { 690 | "assert-plus": "^1.0.0", 691 | "core-util-is": "1.0.2", 692 | "extsprintf": "^1.2.0" 693 | } 694 | } 695 | } 696 | } 697 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "wind-js-server", 3 | "version": "0.0.3", 4 | "description": "Demo rest service to expose Grib2 wind forecast data as JSON", 5 | "main": "app.js", 6 | "scripts": { 7 | "start": "node app.js", 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "keywords": [ 11 | "wind-js", 12 | "node", 13 | "grib2" 14 | ], 15 | "author": "danwild@y7mail.com", 16 | "license": "ISC", 17 | "dependencies": { 18 | "cors": "^2.7.1", 19 | "express": "^4.13.4", 20 | "moment": "^2.12.0", 21 | "q": "^1.4.1", 22 | "request": "^2.70.0" 23 | } 24 | } 25 | --------------------------------------------------------------------------------