diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..984c763 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,202 @@ +{ + "name": "node-mapserver", + "version": "0.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=", + "dev": true + }, + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha1-30boZ9D8Kuxmo0ZitAapzK//Ww8=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha1-bYrlCPWRZ/lA8rWzxKYSrlDJCuY=", + "dev": true, + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.5", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "5.4.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "nan": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", + "integrity": "sha1-kOIrzLjKV+pM03zIPTgZtS7qZ2Y=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha1-HGszdALCE3YF7+GfEP7DkPb6q1Q=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } +} diff --git a/package.json b/package.json index 011cc8a..5f24099 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "readmeFilename": "README.md", "gitHead": "32f694866ad22c3a033c4d907f20e4802bf728c5", "devDependencies": { - "mocha": "^1.10.0", - "nan": "^2.3.3" + "mocha": "^5.2.0", + "nan": "^2.11.1" } } diff --git a/src/mapserver.cpp b/src/mapserver.cpp index 100b679..e50e66b 100644 --- a/src/mapserver.cpp +++ b/src/mapserver.cpp @@ -121,7 +121,6 @@ namespace node_mapserver { NODE_MAPSERVER_DEFINE_CONSTANT(target, "MS_QUERY_SINGLE", MS_QUERY_SINGLE); NODE_MAPSERVER_DEFINE_CONSTANT(target, "MS_RASTER", MS_RASTER); NODE_MAPSERVER_DEFINE_CONSTANT(target, "MS_RED", MS_RED); - NODE_MAPSERVER_DEFINE_CONSTANT(target, "MS_SDE", MS_SDE); NODE_MAPSERVER_DEFINE_CONSTANT(target, "MS_SELECTED", MS_SELECTED); NODE_MAPSERVER_DEFINE_CONSTANT(target, "MS_SHAPEFILE", MS_SHAPEFILE); NODE_MAPSERVER_DEFINE_CONSTANT(target, "MS_SHAPE_LINE", MS_SHAPE_LINE); @@ -150,4 +149,4 @@ namespace node_mapserver { } } -NODE_MODULE(mapserver, node_mapserver::Init); \ No newline at end of file +NODE_MODULE(mapserver, node_mapserver::Init); diff --git a/src/ms_error.cpp b/src/ms_error.cpp index c15d5ac..441481e 100644 --- a/src/ms_error.cpp +++ b/src/ms_error.cpp @@ -6,6 +6,8 @@ void MSError::Initialize(v8::Local target) { v8::Local tpl = Nan::New (MSError::New); tpl->InstanceTemplate()->SetInternalFieldCount(1); tpl->SetClassName(Nan::New("MSError").ToLocalChecked()); + Nan::SetPrototypeMethod(tpl, "toString", ToString); + Nan::SetPrototypeMethod(tpl, "toDetailString", ToString); Nan::SetNamedPropertyHandler( tpl->InstanceTemplate() @@ -52,6 +54,11 @@ v8::Local MSError::NewInstance(errorObj *err_ptr) { return scope.Escape(Nan::New(constructor)->GetFunction()->NewInstance(1, &ext)); } +NAN_METHOD(MSError::ToString) { + MSError *err = Nan::ObjectWrap::Unwrap(info.Holder()); + info.GetReturnValue().Set(Nan::New(err->this_->message).ToLocalChecked()); +} + NAN_PROPERTY_GETTER(MSError::NamedPropertyGetter) { MSError *err = Nan::ObjectWrap::Unwrap(info.Holder()); diff --git a/src/ms_error.hpp b/src/ms_error.hpp index 39384e9..b02d491 100644 --- a/src/ms_error.hpp +++ b/src/ms_error.hpp @@ -13,9 +13,12 @@ class MSError: public Nan::ObjectWrap { static NAN_METHOD(New); static v8::Local NewInstance(errorObj* err_ptr); + static NAN_METHOD(ToString); + MSError(); MSError(errorObj *err); inline errorObj *get() { return this_; } + errorObj *this_; protected: static NAN_PROPERTY_GETTER(NamedPropertyGetter); @@ -24,7 +27,6 @@ class MSError: public Nan::ObjectWrap { private: ~MSError(); - errorObj *this_; }; #endif diff --git a/src/ms_map.cpp b/src/ms_map.cpp index 5fccd65..1c1dfe6 100644 --- a/src/ms_map.cpp +++ b/src/ms_map.cpp @@ -410,14 +410,17 @@ void MSMap::EIO_AfterDrawMap(uv_work_t *req) { Nan::HandleScope scope; drawmap_baton *baton = static_cast(req->data); - + Nan::AsyncResource resource("mapserver:callback"); if (baton->data != NULL) { v8::Local buffer = Nan::NewBuffer(baton->data, baton->size, FreeImageBuffer, NULL).ToLocalChecked(); v8::Local argv[2] = { Nan::Null(), buffer }; - Nan::MakeCallback(Nan::GetCurrentContext()->Global(), Nan::New(baton->cb), 2, argv); + Nan::Callback *callback = new Nan::Callback(Nan::New(baton->cb)); + callback->Call(Nan::GetCurrentContext()->Global(), 2, argv, &resource); + } else { v8::Local argv[1] = { MSError::NewInstance(baton->error) }; - Nan::MakeCallback(Nan::GetCurrentContext()->Global(), Nan::New(baton->cb), 1, argv); + Nan::Callback *callback = new Nan::Callback(Nan::New(baton->cb)); + callback->Call(Nan::GetCurrentContext()->Global(), 1, argv, &resource); } baton->map->Unref(); @@ -480,6 +483,10 @@ NAN_METHOD(MSMap::DrawMap) { argv[0] = MSError::NewInstance(err); argv[1] = Nan::Null(); } - Nan::MakeCallback(Nan::GetCurrentContext()->Global(), info[0].As(), 2, argv); + + Nan::AsyncResource resource("mapserver:callback"); + + Nan::Callback *callback = new Nan::Callback(info[0].As()); + callback->Call(Nan::GetCurrentContext()->Global(), 2, argv, &resource); } } \ No newline at end of file diff --git a/tests/data/bad.map b/tests/data/bad.map new file mode 100755 index 0000000..0315364 --- /dev/null +++ b/tests/data/bad.map @@ -0,0 +1,21 @@ +MAP +NAME GMAP_DEMO +STATUS ON +SIZE 600 300 +EXTENT -180 -90 180 90 +UNITS DD +SHAPEPATH "./foo/bar" +IMAGECOLOR 255 255 255 +PROJECTION + "init=epsg:4326" +END +LAYER + PROJECTION + "init=epsg:4326" + END + NAME prov_bound + TYPE POLYGON + STATUS ON + DATA "foo/wgs_province" +END +END diff --git a/tests/data/test_buffer_70004.png b/tests/data/test_buffer_70004.png new file mode 100644 index 0000000..3ae69c0 Binary files /dev/null and b/tests/data/test_buffer_70004.png differ diff --git a/tests/tests.js b/tests/tests.js index 18a3304..ea139bf 100644 --- a/tests/tests.js +++ b/tests/tests.js @@ -28,6 +28,7 @@ var fs = require('fs'); var path = require('path'); var datadir = path.join(__dirname, 'data'); var mapfile = path.join(datadir, 'test.map'); +var badmapfile = path.join(datadir, 'bad.map'); var symbolfile = path.join(datadir, 'symbolset.txt'); var nomapfile = 'missing.map'; var map; @@ -206,7 +207,7 @@ describe('mapserver', function() { assert.equal(map.height, 300, 'getting map height failed'); assert.equal(map.cellsize, 0, 'default map cellsize should be 0, got ' + map.cellsize); assert.equal(map.scaledenom, -1, 'default map scaledenom should be -1, got ' + map.scaledenom); - assert.equal(map.maxsize, 2048, 'getting map maxsize failed'); + assert.equal(map.maxsize, 4096, 'getting map maxsize failed'); assert.equal(map.units, mapserver.MS_DD, 'getting map units failed'); assert.equal(map.resolution, 72, 'getting map resolution failed'); assert.equal(map.defresolution, 72, 'getting map defresolution failed'); @@ -533,6 +534,8 @@ describe('mapserver', function() { var defaultLayerText = 'LAYER\n NAME "foo"\n STATUS OFF\n TILEITEM "location"\n UNITS METERS\nEND # LAYER\n\n'; +console.log(layer) + assert.equal(layer.toString(), defaultLayerText, 'unexpected default layer text ' + layer.toString()); }); @@ -571,6 +574,26 @@ describe('mapserver', function() { }); }); + it('should not segfault', function(done) { + var v = mapserver.getVersionInt(); + assert.doesNotThrow(function() { + map = new mapserver.Map(badmapfile); + }, Error, 'loading a invalid map file should throw an error.'); + + map.drawMap(function(drawError, buffer) { + if (drawError) { + console.log('error', drawError) + assert.ok(true, 'Returned error from bad map') + done(); + } else { + fs.writeFileSync(path.join(__dirname, 'data', 'bad_out_'+v+'.png'), buffer); + + assert.ok(false, 'Did not receive error drawing map.'); + } + }); + }); + + it('should get the label cache', function(done) { assert.doesNotThrow(function() { map = new mapserver.Map(mapfile);