├── .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 |
--------------------------------------------------------------------------------