{"_id":"signalk-edge-link","_rev":"61-ed4a60d45d47841d2f1f0fadc714bf64","name":"signalk-edge-link","dist-tags":{"latest":"4.3.0"},"versions":{"1.0.0":{"name":"signalk-edge-link","version":"1.0.0","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"author":{"name":"Karl-Erik Gustafsson"},"license":"MIT","_id":"signalk-edge-link@1.0.0","maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"dist":{"shasum":"a38907043e24f2608097a47bf370d7ccdb880a0d","tarball":"https://registry.npmjs.org/signalk-edge-link/-/signalk-edge-link-1.0.0.tgz","fileCount":33,"integrity":"sha512-eyZfdcvkm3/9dJhEuH9vt+vVjL4IFIcDPSZzaXSDPeY+GnZGKCgEfq+2KA6LXVCi1CZ+rh8A5o8KU0xZ7TEayg==","signatures":[{"sig":"MEUCIQCMvyl8io9YOEYDkhTBXZ5zXb3W51fa+Sc7QnQqKubTyQIgBZsWg1Po47JBlXHSBGzhuQXqsyt40mpWYlfjIsY0vIY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2817100},"jest":{"testMatch":["**/__tests__/**/*.js","**/*.test.js","**/*.spec.js"],"transform":{},"testEnvironment":"node","coverageDirectory":"coverage","collectCoverageFrom":["*.js","!webpack.config.js","!.eslintrc.js"],"testPathIgnorePatterns":["/node_modules/","/public/"]},"main":"index.js","gitHead":"6dc0964171b00c31e49d7f9789c2eede4b5c5b55","scripts":{"dev":"webpack --mode development --watch","lint":"eslint .","test":"jest","build":"webpack --mode production","format":"prettier --write \"**/*.{js,json,md}\"","lint:fix":"eslint . --fix","test:watch":"jest --watch","test:coverage":"jest --coverage"},"signalk":{"appIcon":"./icons/icon-72x72.png","displayName":"Edge Link Configuration"},"_npmUser":{"name":"kgustafs","email":"ke.gustafsson@gmail.com"},"repository":{"url":"git+https://github.com/KEGustafsson/signalk-edge-link.git","type":"git"},"_npmVersion":"11.6.1","description":"SignalK Edge Link. Secure UDP link for data exchange.","directories":{},"_nodeVersion":"24.10.0","dependencies":{"@rjsf/core":"^5.18.4","@rjsf/utils":"^5.18.4","ping-monitor":"^0.8.2","@msgpack/msgpack":"^3.0.0","@rjsf/validator-ajv8":"^5.18.4","@signalk/server-admin-ui-dependencies":"*"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.1","webpack":"^5.102.1","prettier":"^3.6.2","css-loader":"^6.8.1","@babel/core":"^7.22.0","webpack-cli":"^5.1.4","babel-loader":"^9.1.2","style-loader":"^3.3.3","@babel/preset-env":"^7.22.0","@babel/preset-react":"^7.22.0","copy-webpack-plugin":"^13.0.1","html-webpack-plugin":"^5.5.3","jest-environment-jsdom":"^30.2.0","mini-css-extract-plugin":"^2.7.6"},"_npmOperationalInternal":{"tmp":"tmp/signalk-edge-link_1.0.0_1770460969829_0.5701511285472705","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"1.0.1":{"name":"signalk-edge-link","version":"1.0.1","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"author":{"name":"Karl-Erik Gustafsson"},"license":"MIT","_id":"signalk-edge-link@1.0.1","maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"dist":{"shasum":"de7b9ea093570f7e2495f96b7fe55f7a69264c1a","tarball":"https://registry.npmjs.org/signalk-edge-link/-/signalk-edge-link-1.0.1.tgz","fileCount":33,"integrity":"sha512-ZGjzsVsaUTjDWwyIt3BSo8+0gE/y8RiKHOMcrkXJCi+R/Ht0hDpI4rt2DR/XWmsX/f5xp5yfY8zXtfrhsJdA9A==","signatures":[{"sig":"MEYCIQCNsX8MjaCUSMuDSuyeqa5S+Av250FT571TPB2TbP793AIhAJagJ5ZyqdO/DZHznZvtLUiwNc5bCAwuZzClHJlOYB3q","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2363201},"jest":{"testMatch":["**/__tests__/**/*.js","**/*.test.js","**/*.spec.js"],"transform":{},"testEnvironment":"node","coverageDirectory":"coverage","collectCoverageFrom":["*.js","!webpack.config.js","!.eslintrc.js"],"testPathIgnorePatterns":["/node_modules/","/public/"]},"main":"index.js","gitHead":"01cd494402b9596a79ac23ea7bb666e8fb8cddea","scripts":{"dev":"webpack --mode development --watch","lint":"eslint .","test":"jest","build":"webpack --mode production","format":"prettier --write \"**/*.{js,json,md}\"","lint:fix":"eslint . --fix","test:watch":"jest --watch","test:coverage":"jest --coverage"},"signalk":{"appIcon":"./icons/icon-72x72.png","displayName":"Edge Link Configuration"},"_npmUser":{"name":"kgustafs","email":"ke.gustafsson@gmail.com"},"repository":{"url":"git+https://github.com/KEGustafsson/signalk-edge-link.git","type":"git"},"_npmVersion":"11.6.1","description":"SignalK Edge Link. Secure UDP link for data exchange.","directories":{},"_nodeVersion":"24.10.0","dependencies":{"@rjsf/core":"^5.18.4","@rjsf/utils":"^5.18.4","ping-monitor":"^0.8.2","@msgpack/msgpack":"^3.0.0","@rjsf/validator-ajv8":"^5.18.4","@signalk/server-admin-ui-dependencies":"1.0.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.1","webpack":"^5.102.1","prettier":"^3.6.2","css-loader":"^6.8.1","@babel/core":"^7.22.0","webpack-cli":"^5.1.4","babel-loader":"^9.1.2","style-loader":"^3.3.3","@babel/preset-env":"^7.22.0","@babel/preset-react":"^7.22.0","copy-webpack-plugin":"^13.0.1","html-webpack-plugin":"^5.5.3","jest-environment-jsdom":"^30.2.0","mini-css-extract-plugin":"^2.7.6"},"_npmOperationalInternal":{"tmp":"tmp/signalk-edge-link_1.0.1_1771249371363_0.027498596277638843","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"2.0.0":{"name":"signalk-edge-link","version":"2.0.0","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"author":{"name":"Karl-Erik Gustafsson"},"license":"MIT","_id":"signalk-edge-link@2.0.0","maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"bin":{"edge-link-cli":"lib/bin/edge-link-cli.js"},"dist":{"shasum":"678be080de6fcc9ea3f1c44663ba58fde69170fe","tarball":"https://registry.npmjs.org/signalk-edge-link/-/signalk-edge-link-2.0.0.tgz","fileCount":55,"integrity":"sha512-oQu0vvW3zqxVyoBLfW1hmXH+G24wwC29F7XJ0VPPssb7BUziTYzU9LOYD1uVBa+hrM57FkCxoswK51PHuzFa2w==","signatures":[{"sig":"MEQCIE6/7LuapcoB/CNELQmx0OpZR/m0izRJp9DzglJfGWrNAiBg0Tiw+Kq1JSGR3ftTeiYPWPh8vMbhkpeTvo7aqoSbrA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2761201},"jest":{"testMatch":["**/__tests__/**/*.js","**/*.test.js","**/*.spec.js"],"transform":{".+\\.tsx$":["ts-jest",{"tsconfig":"tsconfig.webapp.json","diagnostics":false}],"^.+\\.js$":["babel-jest",{"presets":[["@babel/preset-env",{"targets":{"node":"current"}}]]}],"^.+\\.ts$":"ts-jest"},"testEnvironment":"node","coverageDirectory":"coverage","coverageThreshold":{"global":{"lines":65,"branches":60,"functions":65,"statements":65}},"collectCoverageFrom":["lib/**/*.js","!lib/webapp/**","!lib/components/**","!lib/utils/**"],"moduleFileExtensions":["ts","tsx","js","json","node"],"testPathIgnorePatterns":["/node_modules/","/public/"]},"main":"lib/index.js","engines":{"node":">=16"},"gitHead":"ef7107acc189e723a0d5c96f3960ac5b5e110358","scripts":{"cli":"node lib/bin/edge-link-cli.js","dev":"webpack --mode development --watch","lint":"eslint .","test":"jest --runInBand","build":"npm run build:ts && npm run build:web","format":"prettier --write \"**/*.{js,ts,json,md}\"","prepare":"husky","test:v2":"jest __tests__/v2/","build:ts":"npm run clean:lib && tsc","check:ts":"tsc --noEmit","lint:fix":"eslint . --fix","build:web":"npm run clean:public && webpack --mode production","clean:lib":"node -e \"const fs=require('fs');if(fs.existsSync('lib'))fs.rmSync('lib',{recursive:true,force:true});\"","test:watch":"jest --watch","clean:public":"node -e \"const fs=require('fs');if(fs.existsSync('public'))fs.rmSync('public',{recursive:true,force:true});\"","test:coverage":"jest --coverage","migrate:config":"node lib/scripts/migrate-config.js","test:integration":"jest test/integration/"},"signalk":{"appIcon":"./icons/icon-72x72.png","displayName":"Edge Link Configuration"},"_npmUser":{"name":"kgustafs","email":"ke.gustafsson@gmail.com"},"repository":{"url":"git+https://github.com/KEGustafsson/signalk-edge-link.git","type":"git"},"_npmVersion":"11.6.1","description":"SignalK Edge Link. Secure UDP link for data exchange.","directories":{},"lint-staged":{"*.js":["prettier --write","eslint --fix"],"*.ts":["prettier --write"],"*.{json,md}":["prettier --write"]},"_nodeVersion":"24.10.0","dependencies":{"@rjsf/core":"^5.18.4","@rjsf/utils":"^5.18.4","ping-monitor":"^0.8.2","@msgpack/msgpack":"^3.0.0","@rjsf/validator-ajv8":"^5.18.4"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","react":"^16.13.1","eslint":"^8.57.1","ts-jest":"^29.4.6","webpack":"^5.102.1","prettier":"^3.6.2","react-dom":"^16.13.1","ts-loader":"^9.5.4","css-loader":"^6.8.1","typescript":"^5.9.3","@babel/core":"^7.22.0","@types/node":"^25.3.5","lint-staged":"^15.4.3","webpack-cli":"^5.1.4","@types/react":"^16.14.0","babel-loader":"^9.1.2","style-loader":"^3.3.3","@types/react-dom":"^16.9.0","@babel/preset-env":"^7.22.0","@babel/preset-react":"^7.22.0","copy-webpack-plugin":"^14.0.0","eslint-plugin-react":"^7.37.5","html-webpack-plugin":"^5.5.3","react-test-renderer":"^16.14.0","@testing-library/react":"^12.1.5","jest-environment-jsdom":"^30.3.0","mini-css-extract-plugin":"^2.7.6","@testing-library/jest-dom":"^5.17.0"},"_npmOperationalInternal":{"tmp":"tmp/signalk-edge-link_2.0.0_1773758036038_0.13533313667877112","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"2.1.0":{"name":"signalk-edge-link","version":"2.1.0","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"author":{"name":"Karl-Erik Gustafsson"},"license":"MIT","_id":"signalk-edge-link@2.1.0","maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"bin":{"edge-link-cli":"lib/bin/edge-link-cli.js"},"dist":{"shasum":"303cc9ec7d982e13799f59288d4a214a7e4b0c5c","tarball":"https://registry.npmjs.org/signalk-edge-link/-/signalk-edge-link-2.1.0.tgz","fileCount":55,"integrity":"sha512-MiIPbFStkZkAnHKewK0uaWN7Jqd5NhAATtPwOapJAz8vvs7GR3/jIXhRybmsfOFJTyz62PxETCYe0DCz/MnYiw==","signatures":[{"sig":"MEYCIQDJdJpaqlL5ZQlPeFiAeH4QXOYf7rzLHj+dXrlo5RjIJwIhAIvLBQNDsEzowwv37D1t5vj+zsVA1dnc7eQtgKDk0JwD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2761393},"jest":{"testMatch":["**/__tests__/**/*.js","**/*.test.js","**/*.spec.js"],"transform":{".+\\.tsx$":["ts-jest",{"tsconfig":"tsconfig.webapp.json","diagnostics":false}],"^.+\\.js$":["babel-jest",{"presets":[["@babel/preset-env",{"targets":{"node":"current"}}]]}],"^.+\\.ts$":"ts-jest"},"testEnvironment":"node","coverageDirectory":"coverage","coverageThreshold":{"global":{"lines":65,"branches":60,"functions":65,"statements":65}},"collectCoverageFrom":["lib/**/*.js","!lib/webapp/**","!lib/components/**","!lib/utils/**"],"moduleFileExtensions":["ts","tsx","js","json","node"],"testPathIgnorePatterns":["/node_modules/","/public/"]},"main":"lib/index.js","engines":{"node":">=16"},"gitHead":"609cfd0f9c91776e71ef094d9df7b4fdde63edd5","scripts":{"cli":"node lib/bin/edge-link-cli.js","dev":"webpack --mode development --watch","lint":"eslint .","test":"jest --runInBand","build":"npm run build:ts && npm run build:web","format":"prettier --write \"**/*.{js,ts,json,md}\"","prepare":"husky","test:v2":"jest __tests__/v2/","build:ts":"npm run clean:lib && tsc","check:ts":"tsc --noEmit","lint:fix":"eslint . --fix","build:web":"npm run clean:public && webpack --mode production","clean:lib":"node -e \"const fs=require('fs');if(fs.existsSync('lib'))fs.rmSync('lib',{recursive:true,force:true});\"","test:watch":"jest --watch","clean:public":"node -e \"const fs=require('fs');if(fs.existsSync('public'))fs.rmSync('public',{recursive:true,force:true});\"","test:coverage":"jest --coverage","migrate:config":"node lib/scripts/migrate-config.js","test:integration":"jest test/integration/"},"signalk":{"appIcon":"./icons/icon-72x72.png","displayName":"Edge Link Configuration"},"_npmUser":{"name":"kgustafs","email":"ke.gustafsson@gmail.com"},"repository":{"url":"git+https://github.com/KEGustafsson/signalk-edge-link.git","type":"git"},"_npmVersion":"11.6.1","description":"SignalK Edge Link. Secure UDP link for data exchange.","directories":{},"lint-staged":{"*.js":["prettier --write","eslint --fix"],"*.ts":["prettier --write"],"*.{json,md}":["prettier --write"]},"_nodeVersion":"24.10.0","dependencies":{"@rjsf/core":"^5.18.4","@rjsf/utils":"^5.18.4","ping-monitor":"^0.8.2","@msgpack/msgpack":"^3.0.0","@rjsf/validator-ajv8":"^5.18.4"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","react":"^16.13.1","eslint":"^8.57.1","ts-jest":"^29.4.6","webpack":"^5.102.1","prettier":"^3.6.2","react-dom":"^16.13.1","ts-loader":"^9.5.4","css-loader":"^6.8.1","typescript":"^5.9.3","@babel/core":"^7.22.0","@types/node":"^25.3.5","lint-staged":"^15.4.3","webpack-cli":"^5.1.4","@types/react":"^16.14.0","babel-loader":"^9.1.2","style-loader":"^3.3.3","@types/react-dom":"^16.9.0","@babel/preset-env":"^7.22.0","@babel/preset-react":"^7.22.0","copy-webpack-plugin":"^14.0.0","eslint-plugin-react":"^7.37.5","html-webpack-plugin":"^5.5.3","react-test-renderer":"^16.14.0","@testing-library/react":"^12.1.5","jest-environment-jsdom":"^30.3.0","mini-css-extract-plugin":"^2.7.6","@testing-library/jest-dom":"^5.17.0"},"_npmOperationalInternal":{"tmp":"tmp/signalk-edge-link_2.1.0_1774192662663_0.41283429788295467","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"2.1.1":{"name":"signalk-edge-link","version":"2.1.1","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"author":{"name":"Karl-Erik Gustafsson"},"license":"MIT","_id":"signalk-edge-link@2.1.1","maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"bin":{"edge-link-cli":"lib/bin/edge-link-cli.js"},"dist":{"shasum":"cdeefdae6585e7ed72e81afc37dd22467475ebda","tarball":"https://registry.npmjs.org/signalk-edge-link/-/signalk-edge-link-2.1.1.tgz","fileCount":55,"integrity":"sha512-3CEj6J4wwUVObqgDhld59aIuVaDHCJ726PXd5DPgJvONEMK0afimLAPm0DZRgm+gV1/mGBcEAoDDbhi7nKv5LA==","signatures":[{"sig":"MEYCIQDpLMSl05Utw7CugZdwje6DKVOrblfwIx2wwBDUnwvO0gIhAIKzmKT5GUaqnIOkM6I/jdVx0R3xOQXyjSgUe7f60unL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2762648},"jest":{"testMatch":["**/__tests__/**/*.js","**/*.test.js","**/*.spec.js"],"transform":{".+\\.tsx$":["ts-jest",{"tsconfig":"tsconfig.webapp.json","diagnostics":false}],"^.+\\.js$":["babel-jest",{"presets":[["@babel/preset-env",{"targets":{"node":"current"}}]]}],"^.+\\.ts$":"ts-jest"},"testEnvironment":"node","coverageDirectory":"coverage","coverageThreshold":{"global":{"lines":65,"branches":60,"functions":65,"statements":65}},"collectCoverageFrom":["lib/**/*.js","!lib/webapp/**","!lib/components/**","!lib/utils/**"],"moduleFileExtensions":["ts","tsx","js","json","node"],"testPathIgnorePatterns":["/node_modules/","/public/"]},"main":"lib/index.js","engines":{"node":">=16"},"gitHead":"e173dc1e016fcaafbe75219ade1564c1014ca596","scripts":{"cli":"node lib/bin/edge-link-cli.js","dev":"webpack --mode development --watch","lint":"eslint .","test":"jest --runInBand","build":"npm run build:ts && npm run build:web","format":"prettier --write \"**/*.{js,ts,json,md}\"","prepare":"husky","test:v2":"jest __tests__/v2/","build:ts":"npm run clean:lib && tsc","check:ts":"tsc --noEmit","lint:fix":"eslint . --fix","build:web":"npm run clean:public && webpack --mode production","clean:lib":"node -e \"const fs=require('fs');if(fs.existsSync('lib'))fs.rmSync('lib',{recursive:true,force:true});\"","test:watch":"jest --watch","clean:public":"node -e \"const fs=require('fs');if(fs.existsSync('public'))fs.rmSync('public',{recursive:true,force:true});\"","test:coverage":"jest --coverage","migrate:config":"node lib/scripts/migrate-config.js","test:integration":"jest test/integration/"},"signalk":{"appIcon":"./icons/icon-72x72.png","displayName":"Edge Link Configuration"},"_npmUser":{"name":"kgustafs","email":"ke.gustafsson@gmail.com"},"repository":{"url":"git+https://github.com/KEGustafsson/signalk-edge-link.git","type":"git"},"_npmVersion":"11.6.1","description":"SignalK Edge Link. Secure UDP link for data exchange.","directories":{},"lint-staged":{"*.js":["prettier --write","eslint --fix"],"*.ts":["prettier --write"],"*.{json,md}":["prettier --write"]},"_nodeVersion":"24.10.0","dependencies":{"@rjsf/core":"^5.18.4","@rjsf/utils":"^5.18.4","ping-monitor":"^0.8.2","@msgpack/msgpack":"^3.0.0","@rjsf/validator-ajv8":"^5.18.4"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","react":"^16.13.1","eslint":"^8.57.1","ts-jest":"^29.4.6","webpack":"^5.102.1","prettier":"^3.6.2","react-dom":"^16.13.1","ts-loader":"^9.5.4","css-loader":"^6.8.1","typescript":"^5.9.3","@babel/core":"^7.22.0","@types/node":"^25.3.5","lint-staged":"^15.4.3","webpack-cli":"^5.1.4","@types/react":"^16.14.0","babel-loader":"^9.1.2","style-loader":"^3.3.3","@types/react-dom":"^16.9.0","@babel/preset-env":"^7.22.0","@babel/preset-react":"^7.22.0","copy-webpack-plugin":"^14.0.0","eslint-plugin-react":"^7.37.5","html-webpack-plugin":"^5.5.3","react-test-renderer":"^16.14.0","@testing-library/react":"^12.1.5","jest-environment-jsdom":"^30.3.0","mini-css-extract-plugin":"^2.7.6","@testing-library/jest-dom":"^5.17.0"},"_npmOperationalInternal":{"tmp":"tmp/signalk-edge-link_2.1.1_1774275387444_0.15303023862912313","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"2.2.0":{"name":"signalk-edge-link","version":"2.2.0","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"author":{"name":"Karl-Erik Gustafsson"},"license":"MIT","_id":"signalk-edge-link@2.2.0","maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"bin":{"edge-link-cli":"lib/bin/edge-link-cli.js"},"dist":{"shasum":"2b1c6a12ecc7bb275b749f37a0fca3c593b2911b","tarball":"https://registry.npmjs.org/signalk-edge-link/-/signalk-edge-link-2.2.0.tgz","fileCount":56,"integrity":"sha512-9CgKB4AUHdSuwfCRpAq2vv2Bl8L3dD5MWmqB0dvZSh9xgo6BvyH+5XT4GN/+JV2SiGSVuPFrWTfipHerI/FZ3Q==","signatures":[{"sig":"MEUCIQDmIGoQ3f1ZOgRCvxqTludjTy0cREWz6UKiQ1wiEQYlZQIgZgsgVYRCxbH39115ebT60QRGNmWoAJNUD6QDuNu4GHE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2773397},"jest":{"testMatch":["**/__tests__/**/*.js","**/*.test.js","**/*.spec.js"],"transform":{".+\\.tsx$":["ts-jest",{"tsconfig":"tsconfig.webapp.json","diagnostics":false}],"^.+\\.js$":["babel-jest",{"presets":[["@babel/preset-env",{"targets":{"node":"current"}}]]}],"^.+\\.ts$":"ts-jest"},"testEnvironment":"node","coverageDirectory":"coverage","coverageThreshold":{"global":{"lines":65,"branches":60,"functions":65,"statements":65}},"collectCoverageFrom":["lib/**/*.js","!lib/webapp/**","!lib/components/**","!lib/utils/**"],"moduleFileExtensions":["ts","tsx","js","json","node"],"testPathIgnorePatterns":["/node_modules/","/public/"]},"main":"lib/index.js","engines":{"node":">=16"},"gitHead":"99aba2e1c65c59dc62119ec5167fe04e7500e8a2","scripts":{"cli":"node lib/bin/edge-link-cli.js","dev":"webpack --mode development --watch","lint":"eslint .","test":"jest --runInBand","build":"npm run build:ts && npm run build:web","format":"prettier --write \"**/*.{js,ts,json,md}\"","prepare":"husky","test:v2":"jest __tests__/v2/","build:ts":"npm run clean:lib && tsc","check:ts":"tsc --noEmit","lint:fix":"eslint . --fix","build:web":"npm run clean:public && webpack --mode production","clean:lib":"node -e \"const fs=require('fs');if(fs.existsSync('lib'))fs.rmSync('lib',{recursive:true,force:true});\"","test:watch":"jest --watch","clean:public":"node -e \"const fs=require('fs');if(fs.existsSync('public'))fs.rmSync('public',{recursive:true,force:true});\"","test:coverage":"jest --coverage","migrate:config":"node lib/scripts/migrate-config.js","test:integration":"jest test/integration/"},"signalk":{"appIcon":"./icons/icon-72x72.png","displayName":"Edge Link Configuration"},"_npmUser":{"name":"kgustafs","email":"ke.gustafsson@gmail.com"},"repository":{"url":"git+https://github.com/KEGustafsson/signalk-edge-link.git","type":"git"},"_npmVersion":"11.6.1","description":"SignalK Edge Link. Secure UDP link for data exchange.","directories":{},"lint-staged":{"*.js":["prettier --write","eslint --fix"],"*.ts":["prettier --write"],"*.{json,md}":["prettier --write"]},"_nodeVersion":"24.10.0","dependencies":{"@rjsf/core":"^5.18.4","@rjsf/utils":"^5.18.4","ping-monitor":"^0.8.2","@msgpack/msgpack":"^3.0.0","@rjsf/validator-ajv8":"^5.18.4"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","react":"^16.13.1","eslint":"^8.57.1","ts-jest":"^29.4.6","webpack":"^5.102.1","prettier":"^3.6.2","react-dom":"^16.13.1","ts-loader":"^9.5.4","css-loader":"^6.8.1","typescript":"^5.9.3","@babel/core":"^7.22.0","@types/node":"^25.3.5","lint-staged":"^15.4.3","webpack-cli":"^5.1.4","@types/react":"^16.14.0","babel-loader":"^9.1.2","style-loader":"^3.3.3","@types/react-dom":"^16.9.0","@babel/preset-env":"^7.22.0","@babel/preset-react":"^7.22.0","copy-webpack-plugin":"^14.0.0","eslint-plugin-react":"^7.37.5","html-webpack-plugin":"^5.5.3","react-test-renderer":"^16.14.0","@testing-library/react":"^12.1.5","jest-environment-jsdom":"^30.3.0","mini-css-extract-plugin":"^2.7.6","@testing-library/jest-dom":"^5.17.0"},"_npmOperationalInternal":{"tmp":"tmp/signalk-edge-link_2.2.0_1776631002539_0.6982183397330857","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"2.2.1":{"name":"signalk-edge-link","version":"2.2.1","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"author":{"name":"Karl-Erik Gustafsson"},"license":"MIT","_id":"signalk-edge-link@2.2.1","maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"bin":{"edge-link-cli":"lib/bin/edge-link-cli.js"},"dist":{"shasum":"910ec3af712f4052188a6d29e50573927cb57cd5","tarball":"https://registry.npmjs.org/signalk-edge-link/-/signalk-edge-link-2.2.1.tgz","fileCount":56,"integrity":"sha512-DnafYjNfAQK5ChYhc/gnasHC2aoMsiRg/Py/A26GT2n6Xj52+MaxcLL793D1clrAIqzawGaZybRh7t0cc8NSHA==","signatures":[{"sig":"MEQCIFAvIp0sFLI5/0KDaxvBK5718G34nMDfM2lf7+1MOLH+AiBWZFjvd5TYbaPecRZKMy/dUc2fOalHtb4mXTU+ZRiJBA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2773283},"jest":{"testMatch":["**/__tests__/**/*.js","**/*.test.js","**/*.spec.js"],"transform":{".+\\.tsx$":["ts-jest",{"tsconfig":"tsconfig.webapp.json","diagnostics":false}],"^.+\\.js$":["babel-jest",{"presets":[["@babel/preset-env",{"targets":{"node":"current"}}]]}],"^.+\\.ts$":"ts-jest"},"testEnvironment":"node","coverageDirectory":"coverage","coverageThreshold":{"global":{"lines":65,"branches":60,"functions":65,"statements":65}},"collectCoverageFrom":["lib/**/*.js","!lib/webapp/**","!lib/components/**","!lib/utils/**"],"moduleFileExtensions":["ts","tsx","js","json","node"],"testPathIgnorePatterns":["/node_modules/","/public/"]},"main":"lib/index.js","engines":{"node":">=16"},"gitHead":"c2576acb28f9c86e13021b0b6756917a9008bc67","scripts":{"cli":"node lib/bin/edge-link-cli.js","dev":"webpack --mode development --watch","lint":"eslint .","test":"jest --runInBand","build":"npm run build:ts && npm run build:web","format":"prettier --write \"**/*.{js,ts,json,md}\"","prepare":"husky","test:v2":"jest __tests__/v2/","build:ts":"npm run clean:lib && tsc","check:ts":"tsc --noEmit","lint:fix":"eslint . --fix","build:web":"npm run clean:public && webpack --mode production","clean:lib":"node -e \"const fs=require('fs');if(fs.existsSync('lib'))fs.rmSync('lib',{recursive:true,force:true});\"","test:watch":"jest --watch","clean:public":"node -e \"const fs=require('fs');if(fs.existsSync('public'))fs.rmSync('public',{recursive:true,force:true});\"","test:coverage":"jest --coverage","migrate:config":"node lib/scripts/migrate-config.js","test:integration":"jest test/integration/"},"signalk":{"appIcon":"./icons/icon-72x72.png","displayName":"Edge Link Configuration"},"_npmUser":{"name":"kgustafs","email":"ke.gustafsson@gmail.com"},"repository":{"url":"git+https://github.com/KEGustafsson/signalk-edge-link.git","type":"git"},"_npmVersion":"11.6.1","description":"SignalK Edge Link. Secure UDP link for data exchange.","directories":{},"lint-staged":{"*.js":["prettier --write","eslint --fix"],"*.ts":["prettier --write"],"*.{json,md}":["prettier --write"]},"_nodeVersion":"24.10.0","dependencies":{"@rjsf/core":"^5.18.4","@rjsf/utils":"^5.18.4","ping-monitor":"^0.8.2","@msgpack/msgpack":"^3.0.0","@rjsf/validator-ajv8":"^5.18.4"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","react":"^16.13.1","eslint":"^8.57.1","ts-jest":"^29.4.6","webpack":"^5.102.1","prettier":"^3.6.2","react-dom":"^16.13.1","ts-loader":"^9.5.4","css-loader":"^6.8.1","typescript":"^5.9.3","@babel/core":"^7.22.0","@types/node":"^25.3.5","lint-staged":"^15.4.3","webpack-cli":"^5.1.4","@types/react":"^16.14.0","babel-loader":"^9.1.2","style-loader":"^3.3.3","@types/react-dom":"^16.9.0","@babel/preset-env":"^7.22.0","@babel/preset-react":"^7.22.0","copy-webpack-plugin":"^14.0.0","eslint-plugin-react":"^7.37.5","html-webpack-plugin":"^5.5.3","react-test-renderer":"^16.14.0","@testing-library/react":"^12.1.5","jest-environment-jsdom":"^30.3.0","mini-css-extract-plugin":"^2.7.6","@testing-library/jest-dom":"^5.17.0"},"_npmOperationalInternal":{"tmp":"tmp/signalk-edge-link_2.2.1_1776631782730_0.07411505381309436","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"2.3.0":{"name":"signalk-edge-link","version":"2.3.0","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"author":{"name":"Karl-Erik Gustafsson"},"license":"MIT","_id":"signalk-edge-link@2.3.0","maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"bin":{"edge-link-cli":"lib/bin/edge-link-cli.js"},"dist":{"shasum":"c01586ab2f1a1a442cc9fd006c28f8236081736f","tarball":"https://registry.npmjs.org/signalk-edge-link/-/signalk-edge-link-2.3.0.tgz","fileCount":59,"integrity":"sha512-rTWKlVOiruALaUj06y61rwbBkLPRUt5+NNPuS5BvtmnvaDqeDtj0uW4D7XdbWr79xaeTf+/sN2X7Jqdk0hUMDA==","signatures":[{"sig":"MEQCIBdHhPYRXea69K2UqCeo0Y/KD3aXpDqd7anCxoWKTBWyAiBtIto7/GXp/96cSLbq2szJkkY0pDFa+tvWZO0gr05Miw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3419208},"jest":{"testMatch":["**/__tests__/**/*.js","**/*.test.js","**/*.spec.js"],"transform":{".+\\.tsx$":["ts-jest",{"tsconfig":"tsconfig.webapp.json","diagnostics":false}],"^.+\\.js$":["babel-jest",{"presets":[["@babel/preset-env",{"targets":{"node":"current"}}]]}],"^.+\\.ts$":"ts-jest"},"testEnvironment":"node","coverageDirectory":"coverage","coverageThreshold":{"global":{"lines":65,"branches":60,"functions":65,"statements":65}},"collectCoverageFrom":["lib/**/*.js","!lib/webapp/**","!lib/components/**","!lib/utils/**"],"moduleFileExtensions":["ts","tsx","js","json","node"],"testPathIgnorePatterns":["/node_modules/","/public/"]},"main":"lib/index.js","engines":{"node":">=16"},"gitHead":"75a8a833a15a286fa0f7023a8533a27b9ff0ecfd","scripts":{"cli":"node lib/bin/edge-link-cli.js","dev":"webpack --mode development --watch","lint":"eslint .","test":"jest --runInBand","build":"npm run build:ts && npm run build:web","format":"prettier --write \"**/*.{js,ts,json,md}\"","prepare":"husky","test:v2":"jest __tests__/v2/","build:ts":"npm run clean:lib && tsc","check:ts":"tsc --noEmit","lint:fix":"eslint . --fix","build:web":"npm run clean:public && webpack --mode production","clean:lib":"node -e \"const fs=require('fs');if(fs.existsSync('lib'))fs.rmSync('lib',{recursive:true,force:true});\"","test:watch":"jest --watch","clean:public":"node -e \"const fs=require('fs');if(fs.existsSync('public'))fs.rmSync('public',{recursive:true,force:true});\"","test:coverage":"jest --coverage","migrate:config":"node lib/scripts/migrate-config.js","test:integration":"jest test/integration/"},"signalk":{"appIcon":"./icons/icon-72x72.png","displayName":"Edge Link Configuration"},"_npmUser":{"name":"kgustafs","email":"ke.gustafsson@gmail.com"},"repository":{"url":"git+https://github.com/KEGustafsson/signalk-edge-link.git","type":"git"},"_npmVersion":"11.6.1","description":"SignalK Edge Link. Secure UDP link for data exchange.","directories":{},"lint-staged":{"*.js":["prettier --write","eslint --fix"],"*.ts":["prettier --write"],"*.{json,md}":["prettier --write"]},"_nodeVersion":"24.10.0","dependencies":{"@rjsf/core":"^5.18.4","@rjsf/utils":"^5.18.4","ping-monitor":"^0.8.2","@msgpack/msgpack":"^3.0.0","@rjsf/validator-ajv8":"^5.18.4"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","react":"^16.13.1","eslint":"^8.57.1","ts-jest":"^29.4.6","webpack":"^5.102.1","prettier":"^3.6.2","react-dom":"^16.13.1","ts-loader":"^9.5.4","css-loader":"^6.8.1","typescript":"^5.9.3","@babel/core":"^7.22.0","@types/node":"^25.3.5","lint-staged":"^15.4.3","webpack-cli":"^5.1.4","@types/react":"^16.14.0","babel-loader":"^9.1.2","style-loader":"^3.3.3","@types/react-dom":"^16.9.0","@babel/preset-env":"^7.22.0","@babel/preset-react":"^7.22.0","copy-webpack-plugin":"^14.0.0","eslint-plugin-react":"^7.37.5","html-webpack-plugin":"^5.5.3","react-test-renderer":"^16.14.0","@testing-library/react":"^12.1.5","jest-environment-jsdom":"^30.3.0","mini-css-extract-plugin":"^2.7.6","@testing-library/jest-dom":"^5.17.0"},"_npmOperationalInternal":{"tmp":"tmp/signalk-edge-link_2.3.0_1777114436295_0.4366968000868632","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"2.4.0":{"name":"signalk-edge-link","version":"2.4.0","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"author":{"name":"Karl-Erik Gustafsson"},"license":"MIT","_id":"signalk-edge-link@2.4.0","maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"bin":{"edge-link-cli":"lib/bin/edge-link-cli.js"},"dist":{"shasum":"f481a3f463ca16c91bbc15ecef0d15d164b1821d","tarball":"https://registry.npmjs.org/signalk-edge-link/-/signalk-edge-link-2.4.0.tgz","fileCount":58,"integrity":"sha512-ZaYiffz5L/Y2Ynj/vmGKwgk2MXJIIzsDHj3DRl/jdMbL3SBAUeKFtO8j6K/aXDBKEwqUhQCt02VJ9fBtZ4QakQ==","signatures":[{"sig":"MEQCIDh5R1tprLDuh9rczVhNab4CFxK0TEZEVoYlQn9T1WYiAiB+bVK70p+Kan1k7EEhY9finCT+j1tsF4r0Kh1cvtVASQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2875790},"jest":{"testMatch":["**/__tests__/**/*.js","**/*.test.js","**/*.spec.js"],"transform":{".+\\.tsx$":["ts-jest",{"tsconfig":"tsconfig.webapp.json","diagnostics":false}],"^.+\\.js$":["babel-jest",{"presets":[["@babel/preset-env",{"targets":{"node":"current"}}]]}],"^.+\\.ts$":"ts-jest"},"testEnvironment":"node","coverageDirectory":"coverage","coverageThreshold":{"global":{"lines":65,"branches":60,"functions":65,"statements":65}},"collectCoverageFrom":["lib/**/*.js","!lib/webapp/**","!lib/components/**","!lib/utils/**"],"moduleFileExtensions":["ts","tsx","js","json","node"],"testPathIgnorePatterns":["/node_modules/","/public/"]},"main":"lib/index.js","engines":{"node":">=16"},"gitHead":"1abb0bf7cab30723c0e74a736cc751c4e5423705","scripts":{"cli":"node lib/bin/edge-link-cli.js","dev":"webpack --mode development --watch","lint":"eslint .","test":"jest --runInBand","build":"npm run build:ts && npm run build:web","format":"prettier --write \"**/*.{js,ts,json,md}\"","prepare":"husky","test:v2":"jest __tests__/v2/","build:ts":"npm run clean:lib && tsc","check:ts":"tsc --noEmit","lint:fix":"eslint . --fix","build:web":"npm run clean:public && webpack --mode production","clean:lib":"node -e \"const fs=require('fs');if(fs.existsSync('lib'))fs.rmSync('lib',{recursive:true,force:true});\"","test:watch":"jest --watch","clean:public":"node -e \"const fs=require('fs');if(fs.existsSync('public'))fs.rmSync('public',{recursive:true,force:true});\"","test:coverage":"jest --coverage","migrate:config":"node lib/scripts/migrate-config.js","test:integration":"jest test/integration/"},"signalk":{"appIcon":"./icons/icon-72x72.png","displayName":"Edge Link Configuration"},"_npmUser":{"name":"kgustafs","email":"ke.gustafsson@gmail.com"},"repository":{"url":"git+https://github.com/KEGustafsson/signalk-edge-link.git","type":"git"},"_npmVersion":"11.6.1","description":"SignalK Edge Link. Secure UDP link for data exchange.","directories":{},"lint-staged":{"*.js":["prettier --write","eslint --fix"],"*.ts":["prettier --write"],"*.{json,md}":["prettier --write"]},"_nodeVersion":"24.10.0","dependencies":{"@rjsf/core":"^5.18.4","@rjsf/utils":"^5.18.4","ping-monitor":"^0.8.2","@msgpack/msgpack":"^3.0.0","@rjsf/validator-ajv8":"^5.18.4"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","react":"^16.13.1","eslint":"^8.57.1","ts-jest":"^29.4.6","webpack":"^5.102.1","prettier":"^3.6.2","react-dom":"^16.13.1","ts-loader":"^9.5.4","css-loader":"^6.8.1","typescript":"^5.9.3","@babel/core":"^7.22.0","@types/node":"^25.3.5","lint-staged":"^15.4.3","webpack-cli":"^5.1.4","@types/react":"^16.14.0","babel-loader":"^9.1.2","style-loader":"^3.3.3","@types/react-dom":"^16.9.0","@babel/preset-env":"^7.22.0","@babel/preset-react":"^7.22.0","copy-webpack-plugin":"^14.0.0","eslint-plugin-react":"^7.37.5","html-webpack-plugin":"^5.5.3","react-test-renderer":"^16.14.0","@testing-library/react":"^12.1.5","jest-environment-jsdom":"^30.3.0","mini-css-extract-plugin":"^2.7.6","@testing-library/jest-dom":"^5.17.0"},"_npmOperationalInternal":{"tmp":"tmp/signalk-edge-link_2.4.0_1777147123783_0.8776467783830044","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"2.4.1":{"name":"signalk-edge-link","version":"2.4.1","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"author":{"name":"Karl-Erik Gustafsson"},"license":"MIT","_id":"signalk-edge-link@2.4.1","maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"bin":{"edge-link-cli":"lib/bin/edge-link-cli.js"},"dist":{"shasum":"d0fc87078653c009133281fac8be31b90758fd9c","tarball":"https://registry.npmjs.org/signalk-edge-link/-/signalk-edge-link-2.4.1.tgz","fileCount":61,"integrity":"sha512-UTyKXhh9y6bjTd7lZdxGUZm09H5Oxd/y1xSHMBrN9hoYAZSlzYKGCr3ILHrJHCY/z4VLZUwg+HEZUAMqcM48ng==","signatures":[{"sig":"MEQCIAtCvWVVr1eu7KvcOLc1HOwDGxeCFH/GByxulktUWm9KAiAN/vc4WwshGsUDLdX8K2Q+/hXNisoXWAz1l8css6AIKw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2908747},"jest":{"testMatch":["**/__tests__/**/*.js","**/*.test.js","**/*.spec.js"],"transform":{".+\\.tsx$":["ts-jest",{"tsconfig":"tsconfig.webapp.json","diagnostics":false}],"^.+\\.js$":["babel-jest",{"presets":[["@babel/preset-env",{"targets":{"node":"current"}}]]}],"^.+\\.ts$":"ts-jest"},"testEnvironment":"node","coverageDirectory":"coverage","coverageThreshold":{"global":{"lines":65,"branches":60,"functions":65,"statements":65}},"collectCoverageFrom":["lib/**/*.js","!lib/webapp/**","!lib/components/**","!lib/utils/**"],"moduleFileExtensions":["ts","tsx","js","json","node"],"testPathIgnorePatterns":["/node_modules/","/public/"]},"main":"lib/index.js","engines":{"node":">=16"},"gitHead":"327a1e60f4b3bec47f28da41fee8d0cd2fb263e5","scripts":{"cli":"node lib/bin/edge-link-cli.js","dev":"webpack --mode development --watch","lint":"eslint .","test":"jest --runInBand","build":"npm run build:ts && npm run build:web","format":"prettier --write \"**/*.{js,ts,json,md}\"","prepare":"husky","test:v2":"jest __tests__/v2/","build:ts":"npm run clean:lib && tsc","check:ts":"tsc --noEmit","lint:fix":"eslint . --fix","build:web":"npm run clean:public && webpack --mode production","clean:lib":"node -e \"const fs=require('fs');if(fs.existsSync('lib'))fs.rmSync('lib',{recursive:true,force:true});\"","test:watch":"jest --watch","clean:public":"node -e \"const fs=require('fs');if(fs.existsSync('public'))fs.rmSync('public',{recursive:true,force:true});\"","test:coverage":"jest --coverage","migrate:config":"node lib/scripts/migrate-config.js","test:integration":"jest test/integration/"},"signalk":{"appIcon":"./icons/icon-72x72.png","displayName":"Edge Link Configuration"},"_npmUser":{"name":"kgustafs","email":"ke.gustafsson@gmail.com"},"repository":{"url":"git+https://github.com/KEGustafsson/signalk-edge-link.git","type":"git"},"_npmVersion":"11.6.1","description":"SignalK Edge Link. Secure UDP link for data exchange.","directories":{},"lint-staged":{"*.js":["prettier --write","eslint --fix"],"*.ts":["prettier --write"],"*.{json,md}":["prettier --write"]},"_nodeVersion":"24.10.0","dependencies":{"@rjsf/core":"^5.18.4","@rjsf/utils":"^5.18.4","ping-monitor":"^0.8.2","@msgpack/msgpack":"^3.0.0","@rjsf/validator-ajv8":"^5.18.4"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","react":"^16.13.1","eslint":"^8.57.1","ts-jest":"^29.4.6","webpack":"^5.102.1","prettier":"^3.6.2","react-dom":"^16.13.1","ts-loader":"^9.5.4","css-loader":"^6.8.1","typescript":"^5.9.3","@babel/core":"^7.22.0","@types/node":"^25.3.5","lint-staged":"^15.4.3","webpack-cli":"^5.1.4","@types/react":"^16.14.0","babel-loader":"^9.1.2","style-loader":"^3.3.3","@types/react-dom":"^16.9.0","@babel/preset-env":"^7.22.0","@babel/preset-react":"^7.22.0","copy-webpack-plugin":"^14.0.0","eslint-plugin-react":"^7.37.5","html-webpack-plugin":"^5.5.3","react-test-renderer":"^16.14.0","@testing-library/react":"^12.1.5","jest-environment-jsdom":"^30.3.0","mini-css-extract-plugin":"^2.7.6","@testing-library/jest-dom":"^5.17.0"},"_npmOperationalInternal":{"tmp":"tmp/signalk-edge-link_2.4.1_1777392754025_0.9754446541254358","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"2.5.0":{"name":"signalk-edge-link","version":"2.5.0","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"author":{"name":"Karl-Erik Gustafsson"},"license":"MIT","_id":"signalk-edge-link@2.5.0","maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"bin":{"edge-link-cli":"lib/bin/edge-link-cli.js"},"dist":{"shasum":"7003ccfe256af5b8aa97b888d1400613e703fadc","tarball":"https://registry.npmjs.org/signalk-edge-link/-/signalk-edge-link-2.5.0.tgz","fileCount":61,"integrity":"sha512-hiKzo+cpLgq5Tgv4ADonuM22MXI4hAFP4Oi7vBad7ybnCr1A+GvWTn25aYVSyb91DKBEi/mr3dKytqnd1aJvtQ==","signatures":[{"sig":"MEYCIQDRjeJBDS0GtnbSpMB/4h4RoxRTzFUe6YIHZpOTfKgkcAIhAKiFxsE7+oEU/MNAP4idEjJ33InRDmTvucNiYKOSVBLa","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2926835},"jest":{"testMatch":["**/__tests__/**/*.js","**/*.test.js","**/*.spec.js"],"transform":{".+\\.tsx$":["ts-jest",{"tsconfig":"tsconfig.webapp.json","diagnostics":false}],"^.+\\.js$":["babel-jest",{"presets":[["@babel/preset-env",{"targets":{"node":"current"}}]]}],"^.+\\.ts$":"ts-jest"},"testEnvironment":"node","coverageDirectory":"coverage","coverageThreshold":{"global":{"lines":65,"branches":60,"functions":65,"statements":65}},"collectCoverageFrom":["lib/**/*.js","!lib/webapp/**","!lib/components/**","!lib/utils/**"],"moduleFileExtensions":["ts","tsx","js","json","node"],"testPathIgnorePatterns":["/node_modules/","/public/"]},"main":"lib/index.js","engines":{"node":">=16"},"gitHead":"0517fa437bc5e7bf2d366617743b1acf676cbadf","scripts":{"cli":"node lib/bin/edge-link-cli.js","dev":"webpack --mode development --watch","lint":"eslint .","test":"jest --runInBand","build":"npm run build:ts && npm run build:web","format":"prettier --write \"**/*.{js,ts,json,md}\"","prepare":"husky","test:v2":"jest __tests__/v2/","build:ts":"npm run clean:lib && tsc","check:ts":"tsc --noEmit","lint:fix":"eslint . --fix","build:web":"npm run clean:public && webpack --mode production","clean:lib":"node -e \"const fs=require('fs');if(fs.existsSync('lib'))fs.rmSync('lib',{recursive:true,force:true});\"","test:watch":"jest --watch","clean:public":"node -e \"const fs=require('fs');if(fs.existsSync('public'))fs.rmSync('public',{recursive:true,force:true});\"","test:coverage":"jest --coverage","migrate:config":"node lib/scripts/migrate-config.js","test:integration":"jest test/integration/","check:release-docs":"node scripts/check-release-truth.js"},"signalk":{"appIcon":"./icons/icon-72x72.png","displayName":"Edge Link Configuration"},"_npmUser":{"name":"kgustafs","email":"ke.gustafsson@gmail.com"},"repository":{"url":"git+https://github.com/KEGustafsson/signalk-edge-link.git","type":"git"},"_npmVersion":"11.6.1","description":"SignalK Edge Link. Secure UDP link for data exchange.","directories":{},"lint-staged":{"*.js":["prettier --write","eslint --fix"],"*.ts":["prettier --write"],"*.{json,md}":["prettier --write"]},"_nodeVersion":"24.10.0","dependencies":{"@rjsf/core":"^5.18.4","@rjsf/utils":"^5.18.4","ping-monitor":"^0.8.2","@msgpack/msgpack":"^3.0.0","@rjsf/validator-ajv8":"^5.18.4"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","react":"^16.13.1","eslint":"^8.57.1","ts-jest":"^29.4.6","webpack":"^5.102.1","prettier":"^3.6.2","react-dom":"^16.13.1","ts-loader":"^9.5.4","css-loader":"^6.8.1","typescript":"^5.9.3","@babel/core":"^7.22.0","@types/node":"^25.3.5","lint-staged":"^15.4.3","webpack-cli":"^5.1.4","@types/react":"^16.14.0","babel-loader":"^9.1.2","style-loader":"^3.3.3","@types/react-dom":"^16.9.0","@babel/preset-env":"^7.22.0","@babel/preset-react":"^7.22.0","copy-webpack-plugin":"^14.0.0","eslint-plugin-react":"^7.37.5","html-webpack-plugin":"^5.5.3","react-test-renderer":"^16.14.0","@testing-library/react":"^12.1.5","jest-environment-jsdom":"^30.3.0","mini-css-extract-plugin":"^2.7.6","@testing-library/jest-dom":"^5.17.0"},"_npmOperationalInternal":{"tmp":"tmp/signalk-edge-link_2.5.0_1777917498659_0.9422085752156713","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"2.5.1":{"name":"signalk-edge-link","version":"2.5.1","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"author":{"name":"Karl-Erik Gustafsson"},"license":"MIT","_id":"signalk-edge-link@2.5.1","maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"bin":{"edge-link-cli":"lib/bin/edge-link-cli.js"},"dist":{"shasum":"cbedc0eea6b52ddc44802b4d22752e6565f7f009","tarball":"https://registry.npmjs.org/signalk-edge-link/-/signalk-edge-link-2.5.1.tgz","fileCount":62,"integrity":"sha512-SJl/BmWHBodxVhUJljy0H8IbouLLo1bV73mjF7moBXj1waLXqj5aIBJNfe+Abdzwf+k7DPAwmTTFjrPbgQ6P8g==","signatures":[{"sig":"MEUCIQD2r3hPnrBFwKm6MbIAK7oBdFnip5r6cSDCwLFFFAAmnwIgSjbqTLuINL4Ay3Hiuf7hipkitxXRN92Em0zko2jMDCc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2943829},"jest":{"testMatch":["**/__tests__/**/*.js","**/*.test.js","**/*.spec.js"],"transform":{".+\\.tsx$":["ts-jest",{"tsconfig":"tsconfig.webapp.json","diagnostics":false}],"^.+\\.js$":["babel-jest",{"presets":[["@babel/preset-env",{"targets":{"node":"current"}}]]}],"^.+\\.ts$":"ts-jest"},"testEnvironment":"node","coverageDirectory":"coverage","coverageThreshold":{"global":{"lines":65,"branches":60,"functions":65,"statements":65}},"collectCoverageFrom":["lib/**/*.js","!lib/webapp/**","!lib/components/**","!lib/utils/**"],"moduleFileExtensions":["ts","tsx","js","json","node"],"testPathIgnorePatterns":["/node_modules/","/public/"]},"main":"lib/index.js","engines":{"node":">=16"},"gitHead":"fd56cdc49f5c924e1928a382d3a917f5c54e40d5","scripts":{"cli":"node lib/bin/edge-link-cli.js","dev":"webpack --mode development --watch","lint":"eslint .","test":"jest --runInBand","build":"npm run build:ts && npm run build:web","format":"prettier --write \"**/*.{js,ts,json,md}\"","prepare":"husky","test:v2":"jest __tests__/v2/","build:ts":"npm run clean:lib && tsc","check:ts":"tsc --noEmit","lint:fix":"eslint . --fix","build:web":"npm run clean:public && webpack --mode production","clean:lib":"node -e \"const fs=require('fs');if(fs.existsSync('lib'))fs.rmSync('lib',{recursive:true,force:true});\"","test:watch":"jest --watch","clean:public":"node -e \"const fs=require('fs');if(fs.existsSync('public'))fs.rmSync('public',{recursive:true,force:true});\"","test:coverage":"jest --coverage","migrate:config":"node lib/scripts/migrate-config.js","test:integration":"jest test/integration/","check:release-docs":"node scripts/check-release-truth.js"},"signalk":{"appIcon":"./icons/icon-72x72.png","displayName":"Edge Link Configuration"},"_npmUser":{"name":"kgustafs","email":"ke.gustafsson@gmail.com"},"repository":{"url":"git+https://github.com/KEGustafsson/signalk-edge-link.git","type":"git"},"_npmVersion":"11.6.1","description":"SignalK Edge Link. Secure UDP link for data exchange.","directories":{},"lint-staged":{"*.js":["prettier --write","eslint --fix"],"*.ts":["prettier --write"],"*.{json,md}":["prettier --write"]},"_nodeVersion":"24.10.0","dependencies":{"@rjsf/core":"^5.18.4","@rjsf/utils":"^5.18.4","ping-monitor":"^0.8.2","@msgpack/msgpack":"^3.0.0","@rjsf/validator-ajv8":"^5.18.4"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","react":"^16.13.1","eslint":"^8.57.1","ts-jest":"^29.4.6","webpack":"^5.102.1","prettier":"^3.6.2","react-dom":"^16.13.1","ts-loader":"^9.5.4","css-loader":"^6.8.1","typescript":"^5.9.3","@babel/core":"^7.22.0","@types/node":"^25.3.5","lint-staged":"^15.4.3","webpack-cli":"^5.1.4","@types/react":"^16.14.0","babel-loader":"^9.1.2","style-loader":"^3.3.3","@types/react-dom":"^16.9.0","@babel/preset-env":"^7.22.0","@babel/preset-react":"^7.22.0","copy-webpack-plugin":"^14.0.0","eslint-plugin-react":"^7.37.5","html-webpack-plugin":"^5.5.3","react-test-renderer":"^16.14.0","@testing-library/react":"^12.1.5","jest-environment-jsdom":"^30.3.0","mini-css-extract-plugin":"^2.7.6","@testing-library/jest-dom":"^5.17.0"},"_npmOperationalInternal":{"tmp":"tmp/signalk-edge-link_2.5.1_1778442480021_0.703216062482926","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"2.6.0":{"name":"signalk-edge-link","version":"2.6.0","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"author":{"name":"Karl-Erik Gustafsson"},"license":"MIT","_id":"signalk-edge-link@2.6.0","maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"bin":{"edge-link-cli":"lib/bin/edge-link-cli.js"},"dist":{"shasum":"4769664bfc47119ddc62366389930898159d3c79","tarball":"https://registry.npmjs.org/signalk-edge-link/-/signalk-edge-link-2.6.0.tgz","fileCount":62,"integrity":"sha512-Bj3HKQDc3CHpEo2VQltqAC9r+y0eM6r+6YCMbzZnxDh+P0mBZVCMDwaY0hADbhEkuNLa74Q42uqWKGgpUHKuRQ==","signatures":[{"sig":"MEYCIQD0AWFiiwA0qSD8cec69csK4ZCRrxD/MUg+rg6+vLbJ1AIhAN/JXDNX1IX0PDyvZyoFxixV9FKsAk7pXJx9oDxrN3tO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2950858},"jest":{"testMatch":["**/__tests__/**/*.js","**/*.test.js","**/*.spec.js"],"transform":{".+\\.tsx$":["ts-jest",{"tsconfig":"tsconfig.webapp.json","diagnostics":false}],"^.+\\.js$":["babel-jest",{"presets":[["@babel/preset-env",{"targets":{"node":"current"}}]]}],"^.+\\.ts$":"ts-jest"},"testEnvironment":"node","coverageDirectory":"coverage","coverageThreshold":{"global":{"lines":65,"branches":60,"functions":65,"statements":65}},"collectCoverageFrom":["lib/**/*.js","!lib/webapp/**","!lib/components/**","!lib/utils/**"],"moduleFileExtensions":["ts","tsx","js","json","node"],"testPathIgnorePatterns":["/node_modules/","/public/"]},"main":"lib/index.js","engines":{"node":">=16"},"gitHead":"8d621cbe2ecbef4c66a8b4204247005532824dcf","scripts":{"cli":"node lib/bin/edge-link-cli.js","dev":"webpack --mode development --watch","lint":"eslint .","test":"jest --runInBand","build":"npm run build:ts && npm run build:web","format":"prettier --write \"**/*.{js,ts,json,md}\"","prepare":"husky","test:v2":"jest __tests__/v2/","build:ts":"npm run clean:lib && tsc","check:ts":"tsc --noEmit","lint:fix":"eslint . --fix","build:web":"npm run clean:public && webpack --mode production","clean:lib":"node -e \"const fs=require('fs');if(fs.existsSync('lib'))fs.rmSync('lib',{recursive:true,force:true});\"","test:watch":"jest --watch","clean:public":"node -e \"const fs=require('fs');if(fs.existsSync('public'))fs.rmSync('public',{recursive:true,force:true});\"","test:coverage":"jest --coverage","migrate:config":"node lib/scripts/migrate-config.js","test:integration":"jest test/integration/","check:release-docs":"node scripts/check-release-truth.js"},"signalk":{"appIcon":"./icons/icon-72x72.png","displayName":"Edge Link Configuration"},"_npmUser":{"name":"kgustafs","email":"ke.gustafsson@gmail.com"},"repository":{"url":"git+https://github.com/KEGustafsson/signalk-edge-link.git","type":"git"},"_npmVersion":"11.6.1","description":"SignalK Edge Link. Secure UDP link for data exchange.","directories":{},"lint-staged":{"*.js":["prettier --write","eslint --fix"],"*.ts":["prettier --write"],"*.{json,md}":["prettier --write"]},"_nodeVersion":"24.10.0","dependencies":{"@rjsf/core":"^5.18.4","@rjsf/utils":"^5.18.4","ping-monitor":"^0.8.2","@msgpack/msgpack":"^3.0.0","@rjsf/validator-ajv8":"^5.18.4"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","react":"^16.13.1","eslint":"^8.57.1","ts-jest":"^29.4.6","webpack":"^5.102.1","prettier":"^3.6.2","react-dom":"^16.13.1","ts-loader":"^9.5.4","css-loader":"^6.8.1","typescript":"^5.9.3","@babel/core":"^7.22.0","@types/node":"^25.3.5","lint-staged":"^15.4.3","webpack-cli":"^5.1.4","@types/react":"^16.14.0","babel-loader":"^9.1.2","style-loader":"^3.3.3","@types/react-dom":"^16.9.0","@babel/preset-env":"^7.22.0","@babel/preset-react":"^7.22.0","copy-webpack-plugin":"^14.0.0","eslint-plugin-react":"^7.37.5","html-webpack-plugin":"^5.5.3","react-test-renderer":"^16.14.0","@testing-library/react":"^12.1.5","jest-environment-jsdom":"^30.3.0","mini-css-extract-plugin":"^2.7.6","@testing-library/jest-dom":"^5.17.0"},"_npmOperationalInternal":{"tmp":"tmp/signalk-edge-link_2.6.0_1778520839411_0.43067347549503165","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"2.6.1":{"name":"signalk-edge-link","version":"2.6.1","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"author":{"name":"Karl-Erik Gustafsson"},"license":"MIT","_id":"signalk-edge-link@2.6.1","maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"bin":{"edge-link-cli":"lib/bin/edge-link-cli.js"},"dist":{"shasum":"01bc1e23d747f8268126983e277bf4dd94e3fcfb","tarball":"https://registry.npmjs.org/signalk-edge-link/-/signalk-edge-link-2.6.1.tgz","fileCount":62,"integrity":"sha512-KlXdUdEo3o+rJ/JJVEzykeN/FHpyEuZTEIabTifT6J2rEBh5g+lKW1r++zu/ApvAfFO0oeWe205oR/Zg2pO9kQ==","signatures":[{"sig":"MEQCH0MsfzKoFpiUHDFrED8AOWptjTX27RNWevKiQ7W6s9MCIQDWW2jcseq9Uze+LfEbMMa+CQwgYYEgwqigSXeS4H+GEg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2937060},"jest":{"testMatch":["**/__tests__/**/*.js","**/*.test.js","**/*.spec.js"],"transform":{".+\\.tsx$":["ts-jest",{"tsconfig":"tsconfig.webapp.json","diagnostics":false}],"^.+\\.js$":["babel-jest",{"presets":[["@babel/preset-env",{"targets":{"node":"current"}}]]}],"^.+\\.ts$":"ts-jest"},"testEnvironment":"node","coverageDirectory":"coverage","coverageThreshold":{"global":{"lines":65,"branches":60,"functions":65,"statements":65}},"collectCoverageFrom":["lib/**/*.js","!lib/webapp/**","!lib/components/**","!lib/utils/**"],"moduleFileExtensions":["ts","tsx","js","json","node"],"testPathIgnorePatterns":["/node_modules/","/public/"]},"main":"lib/index.js","engines":{"node":">=16"},"gitHead":"98db6d840acb92212947a1abedbc238d84052e4e","scripts":{"cli":"node lib/bin/edge-link-cli.js","dev":"webpack --mode development --watch","lint":"eslint .","test":"jest --runInBand","build":"npm run build:ts && npm run build:web","format":"prettier --write \"**/*.{js,ts,json,md}\"","prepare":"husky","test:v2":"jest __tests__/v2/","build:ts":"npm run clean:lib && tsc","check:ts":"tsc --noEmit","lint:fix":"eslint . --fix","build:web":"npm run clean:public && webpack --mode production","clean:lib":"node -e \"const fs=require('fs');if(fs.existsSync('lib'))fs.rmSync('lib',{recursive:true,force:true});\"","test:watch":"jest --watch","clean:public":"node -e \"const fs=require('fs');if(fs.existsSync('public'))fs.rmSync('public',{recursive:true,force:true});\"","test:coverage":"jest --coverage","migrate:config":"node lib/scripts/migrate-config.js","test:integration":"jest test/integration/","check:release-docs":"node scripts/check-release-truth.js"},"signalk":{"appIcon":"./icons/icon-72x72.png","displayName":"Edge Link Configuration"},"_npmUser":{"name":"kgustafs","email":"ke.gustafsson@gmail.com"},"repository":{"url":"git+https://github.com/KEGustafsson/signalk-edge-link.git","type":"git"},"_npmVersion":"11.6.1","description":"SignalK Edge Link. Secure UDP link for data exchange.","directories":{},"lint-staged":{"*.js":["prettier --write","eslint --fix"],"*.ts":["prettier --write"],"*.{json,md}":["prettier --write"]},"_nodeVersion":"24.10.0","dependencies":{"@rjsf/core":"^5.18.4","@rjsf/utils":"^5.18.4","ping-monitor":"^0.8.2","@msgpack/msgpack":"^3.0.0","@rjsf/validator-ajv8":"^5.18.4"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","react":"^16.13.1","eslint":"^8.57.1","ts-jest":"^29.4.6","webpack":"^5.102.1","prettier":"^3.6.2","react-dom":"^16.13.1","ts-loader":"^9.5.4","css-loader":"^6.8.1","typescript":"^5.9.3","@babel/core":"^7.22.0","@types/node":"^25.3.5","lint-staged":"^15.4.3","webpack-cli":"^5.1.4","@types/react":"^16.14.0","babel-loader":"^9.1.2","style-loader":"^3.3.3","@types/react-dom":"^16.9.0","@babel/preset-env":"^7.22.0","@babel/preset-react":"^7.22.0","copy-webpack-plugin":"^14.0.0","eslint-plugin-react":"^7.37.5","html-webpack-plugin":"^5.5.3","react-test-renderer":"^16.14.0","@testing-library/react":"^12.1.5","jest-environment-jsdom":"^30.3.0","mini-css-extract-plugin":"^2.7.6","@testing-library/jest-dom":"^5.17.0"},"_npmOperationalInternal":{"tmp":"tmp/signalk-edge-link_2.6.1_1778525713996_0.3377616953732314","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"2.6.2":{"name":"signalk-edge-link","version":"2.6.2","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"author":{"name":"Karl-Erik Gustafsson"},"license":"MIT","_id":"signalk-edge-link@2.6.2","maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"bin":{"edge-link-cli":"lib/bin/edge-link-cli.js"},"dist":{"shasum":"ee27fb8701fa15af9823c856d46be8e18557e72d","tarball":"https://registry.npmjs.org/signalk-edge-link/-/signalk-edge-link-2.6.2.tgz","fileCount":62,"integrity":"sha512-WAXVBw0wn4oYbmqCd4M/XxbE9ZxB9Tbhnd4wK7tyywIoPr+To0DDyVIu5SliekYr5ePrpOJKzpMyhncxM/hI0Q==","signatures":[{"sig":"MEUCIARo/xOoiOuo9LQXmVOXC7XiueOSCApuSQ+QAel7IYBuAiEA+9XvnjBpwvDZ+qO7xruN71jdeSNm+uQaZ7dBF1D9vhA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2940044},"jest":{"testMatch":["**/__tests__/**/*.js","**/*.test.js","**/*.spec.js"],"transform":{".+\\.tsx$":["ts-jest",{"tsconfig":"tsconfig.webapp.json","diagnostics":false}],"^.+\\.js$":["babel-jest",{"presets":[["@babel/preset-env",{"targets":{"node":"current"}}]]}],"^.+\\.ts$":"ts-jest"},"testEnvironment":"node","coverageDirectory":"coverage","coverageThreshold":{"global":{"lines":65,"branches":60,"functions":65,"statements":65}},"collectCoverageFrom":["lib/**/*.js","!lib/webapp/**","!lib/components/**","!lib/utils/**"],"moduleFileExtensions":["ts","tsx","js","json","node"],"testPathIgnorePatterns":["/node_modules/","/public/"]},"main":"lib/index.js","engines":{"node":">=16"},"gitHead":"7b3aedd2719337b44d9c68e751fe08d243a4c71d","scripts":{"cli":"node lib/bin/edge-link-cli.js","dev":"webpack --mode development --watch","lint":"eslint .","test":"jest --runInBand","build":"npm run build:ts && npm run build:web","format":"prettier --write \"**/*.{js,ts,json,md}\"","prepare":"husky","test:v2":"jest __tests__/v2/","build:ts":"npm run clean:lib && tsc","check:ts":"tsc --noEmit","lint:fix":"eslint . --fix","build:web":"npm run clean:public && webpack --mode production","clean:lib":"node -e \"const fs=require('fs');if(fs.existsSync('lib'))fs.rmSync('lib',{recursive:true,force:true});\"","test:watch":"jest --watch","clean:public":"node -e \"const fs=require('fs');if(fs.existsSync('public'))fs.rmSync('public',{recursive:true,force:true});\"","test:coverage":"jest --coverage","migrate:config":"node lib/scripts/migrate-config.js","test:integration":"jest test/integration/","check:release-docs":"node scripts/check-release-truth.js"},"signalk":{"appIcon":"./icons/icon-72x72.png","displayName":"Edge Link Configuration"},"_npmUser":{"name":"kgustafs","email":"ke.gustafsson@gmail.com"},"repository":{"url":"git+https://github.com/KEGustafsson/signalk-edge-link.git","type":"git"},"_npmVersion":"11.6.1","description":"SignalK Edge Link. Secure UDP link for data exchange.","directories":{},"lint-staged":{"*.js":["prettier --write","eslint --fix"],"*.ts":["prettier --write"],"*.{json,md}":["prettier --write"]},"_nodeVersion":"24.10.0","dependencies":{"@rjsf/core":"^5.18.4","@rjsf/utils":"^5.18.4","ping-monitor":"^0.8.2","@msgpack/msgpack":"^3.0.0","@rjsf/validator-ajv8":"^5.18.4"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","react":"^16.13.1","eslint":"^8.57.1","ts-jest":"^29.4.6","webpack":"^5.102.1","prettier":"^3.6.2","react-dom":"^16.13.1","ts-loader":"^9.5.4","css-loader":"^6.8.1","typescript":"^5.9.3","@babel/core":"^7.22.0","@types/node":"^25.3.5","lint-staged":"^15.4.3","webpack-cli":"^5.1.4","@types/react":"^16.14.0","babel-loader":"^9.1.2","style-loader":"^3.3.3","@types/react-dom":"^16.9.0","@babel/preset-env":"^7.22.0","@babel/preset-react":"^7.22.0","copy-webpack-plugin":"^14.0.0","eslint-plugin-react":"^7.37.5","html-webpack-plugin":"^5.5.3","react-test-renderer":"^16.14.0","@testing-library/react":"^12.1.5","jest-environment-jsdom":"^30.3.0","mini-css-extract-plugin":"^2.7.6","@testing-library/jest-dom":"^5.17.0"},"_npmOperationalInternal":{"tmp":"tmp/signalk-edge-link_2.6.2_1778596394109_0.9496233718400497","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"2.6.3":{"name":"signalk-edge-link","version":"2.6.3","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"author":{"name":"Karl-Erik Gustafsson"},"license":"MIT","_id":"signalk-edge-link@2.6.3","maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"bin":{"edge-link-cli":"lib/bin/edge-link-cli.js"},"dist":{"shasum":"b651b367860197b1d5a7648397a5e01d9930a1d6","tarball":"https://registry.npmjs.org/signalk-edge-link/-/signalk-edge-link-2.6.3.tgz","fileCount":62,"integrity":"sha512-syl0aoBVYmdS6v5QlUdnpJMVk8Jno2RZDkaB7W4RZy7kziKgHD97EVjiuRCNtfsfyFViyGWRMExywtdEQuP0XA==","signatures":[{"sig":"MEUCIFzKua8yps9yePSyF9mI9ouG538XfswzGoMHgqTBAfEKAiEArmyViiicqKsou1ARoD1EXH4cHATq2r73NDJ3OLC+7q8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2943651},"jest":{"testMatch":["**/__tests__/**/*.js","**/*.test.js","**/*.spec.js"],"transform":{".+\\.tsx$":["ts-jest",{"tsconfig":"tsconfig.webapp.json","diagnostics":false}],"^.+\\.js$":["babel-jest",{"presets":[["@babel/preset-env",{"targets":{"node":"current"}}]]}],"^.+\\.ts$":"ts-jest"},"testEnvironment":"node","coverageDirectory":"coverage","coverageThreshold":{"global":{"lines":65,"branches":60,"functions":65,"statements":65}},"collectCoverageFrom":["lib/**/*.js","!lib/webapp/**","!lib/components/**","!lib/utils/**"],"moduleFileExtensions":["ts","tsx","js","json","node"],"testPathIgnorePatterns":["/node_modules/","/public/"]},"main":"lib/index.js","engines":{"node":">=16"},"gitHead":"e919d688d3e9692160e9e29a1ba31f80b2d9d72e","scripts":{"cli":"node lib/bin/edge-link-cli.js","dev":"webpack --mode development --watch","lint":"eslint .","test":"jest --runInBand","build":"npm run build:ts && npm run build:web","format":"prettier --write \"**/*.{js,ts,json,md}\"","prepare":"husky","test:v2":"jest __tests__/v2/","build:ts":"npm run clean:lib && tsc","check:ts":"tsc --noEmit","lint:fix":"eslint . --fix","build:web":"npm run clean:public && webpack --mode production","clean:lib":"node -e \"const fs=require('fs');if(fs.existsSync('lib'))fs.rmSync('lib',{recursive:true,force:true});\"","test:watch":"jest --watch","clean:public":"node -e \"const fs=require('fs');if(fs.existsSync('public'))fs.rmSync('public',{recursive:true,force:true});\"","test:coverage":"jest --coverage","migrate:config":"node lib/scripts/migrate-config.js","test:integration":"jest test/integration/","check:release-docs":"node scripts/check-release-truth.js"},"signalk":{"appIcon":"./icons/icon-72x72.png","displayName":"Edge Link Configuration"},"_npmUser":{"name":"kgustafs","email":"ke.gustafsson@gmail.com"},"repository":{"url":"git+https://github.com/KEGustafsson/signalk-edge-link.git","type":"git"},"_npmVersion":"11.6.1","description":"SignalK Edge Link. Secure UDP link for data exchange.","directories":{},"lint-staged":{"*.js":["prettier --write","eslint --fix"],"*.ts":["prettier --write"],"*.{json,md}":["prettier --write"]},"_nodeVersion":"24.10.0","dependencies":{"@rjsf/core":"^5.18.4","@rjsf/utils":"^5.18.4","ping-monitor":"^0.8.2","@msgpack/msgpack":"^3.0.0","@rjsf/validator-ajv8":"^5.18.4"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","react":"^16.13.1","eslint":"^8.57.1","ts-jest":"^29.4.6","webpack":"^5.102.1","prettier":"^3.6.2","react-dom":"^16.13.1","ts-loader":"^9.5.4","css-loader":"^6.8.1","typescript":"^5.9.3","@babel/core":"^7.22.0","@types/node":"^25.3.5","lint-staged":"^15.4.3","webpack-cli":"^5.1.4","@types/react":"^16.14.0","babel-loader":"^9.1.2","style-loader":"^3.3.3","@types/react-dom":"^16.9.0","@babel/preset-env":"^7.22.0","@babel/preset-react":"^7.22.0","copy-webpack-plugin":"^14.0.0","eslint-plugin-react":"^7.37.5","html-webpack-plugin":"^5.5.3","react-test-renderer":"^16.14.0","@testing-library/react":"^12.1.5","jest-environment-jsdom":"^30.3.0","mini-css-extract-plugin":"^2.7.6","@testing-library/jest-dom":"^5.17.0"},"_npmOperationalInternal":{"tmp":"tmp/signalk-edge-link_2.6.3_1778601401763_0.22053131875523935","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"2.7.0":{"name":"signalk-edge-link","version":"2.7.0","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"author":{"name":"Karl-Erik Gustafsson"},"license":"MIT","_id":"signalk-edge-link@2.7.0","maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"bin":{"edge-link-cli":"lib/bin/edge-link-cli.js"},"dist":{"shasum":"b294e57d4fd47d427ad7924cd0bb004218fe0a69","tarball":"https://registry.npmjs.org/signalk-edge-link/-/signalk-edge-link-2.7.0.tgz","fileCount":62,"integrity":"sha512-JpV1/yBxCA4eW/aWqR5t8UqfWgbZbkXqubrJanMFWSt1vtv/nhvfmV2ru7uIuc1VGSSUxUvMg2zlmd2LPgIHAQ==","signatures":[{"sig":"MEQCIH2zpJFw03GscXpluDX8hoAtea5j9XqWwG1MAnBPrepDAiBr2yCmQ5emk1/A3O4cQZ1sPeO/nA0NTc5tNPdJnEs6EA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2959606},"jest":{"testMatch":["**/__tests__/**/*.js","**/*.test.js","**/*.spec.js"],"transform":{".+\\.tsx$":["ts-jest",{"tsconfig":"tsconfig.webapp.json","diagnostics":false}],"^.+\\.js$":["babel-jest",{"presets":[["@babel/preset-env",{"targets":{"node":"current"}}]]}],"^.+\\.ts$":"ts-jest"},"testEnvironment":"node","coverageDirectory":"coverage","coverageThreshold":{"global":{"lines":65,"branches":60,"functions":65,"statements":65}},"collectCoverageFrom":["lib/**/*.js","!lib/webapp/**","!lib/components/**","!lib/utils/**"],"moduleFileExtensions":["ts","tsx","js","json","node"],"testPathIgnorePatterns":["/node_modules/","/public/"]},"main":"lib/index.js","engines":{"node":">=16"},"gitHead":"1ecd4f76d3ec35c65a3be583b4c70c20fee4b295","scripts":{"cli":"node lib/bin/edge-link-cli.js","dev":"webpack --mode development --watch","lint":"eslint .","test":"jest --runInBand","build":"npm run build:ts && npm run build:web","format":"prettier --write \"**/*.{js,ts,json,md}\"","prepare":"husky","test:v2":"jest __tests__/v2/","build:ts":"npm run clean:lib && tsc","check:ts":"tsc --noEmit","lint:fix":"eslint . --fix","build:web":"npm run clean:public && webpack --mode production","clean:lib":"node -e \"const fs=require('fs');if(fs.existsSync('lib'))fs.rmSync('lib',{recursive:true,force:true});\"","test:watch":"jest --watch","clean:public":"node -e \"const fs=require('fs');if(fs.existsSync('public'))fs.rmSync('public',{recursive:true,force:true});\"","test:coverage":"jest --coverage","migrate:config":"node lib/scripts/migrate-config.js","test:integration":"jest test/integration/","check:release-docs":"node scripts/check-release-truth.js"},"signalk":{"appIcon":"./icons/icon-72x72.png","displayName":"Edge Link Configuration"},"_npmUser":{"name":"kgustafs","email":"ke.gustafsson@gmail.com"},"repository":{"url":"git+https://github.com/KEGustafsson/signalk-edge-link.git","type":"git"},"_npmVersion":"11.6.1","description":"SignalK Edge Link. Secure UDP link for data exchange.","directories":{},"lint-staged":{"*.js":["prettier --write","eslint --fix"],"*.ts":["prettier --write"],"*.{json,md}":["prettier --write"]},"_nodeVersion":"24.10.0","dependencies":{"@rjsf/core":"^5.18.4","@rjsf/utils":"^5.18.4","ping-monitor":"^0.8.2","@msgpack/msgpack":"^3.0.0","@rjsf/validator-ajv8":"^5.18.4"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","react":"^16.13.1","eslint":"^8.57.1","ts-jest":"^29.4.6","webpack":"^5.102.1","prettier":"^3.6.2","react-dom":"^16.13.1","ts-loader":"^9.5.4","css-loader":"^6.8.1","typescript":"^5.9.3","@babel/core":"^7.22.0","@types/node":"^25.3.5","lint-staged":"^15.4.3","webpack-cli":"^5.1.4","@types/react":"^16.14.0","babel-loader":"^9.1.2","style-loader":"^3.3.3","@types/react-dom":"^16.9.0","@babel/preset-env":"^7.22.0","@babel/preset-react":"^7.22.0","copy-webpack-plugin":"^14.0.0","eslint-plugin-react":"^7.37.5","html-webpack-plugin":"^5.5.3","react-test-renderer":"^16.14.0","@testing-library/react":"^12.1.5","jest-environment-jsdom":"^30.3.0","mini-css-extract-plugin":"^2.7.6","@testing-library/jest-dom":"^5.17.0"},"_npmOperationalInternal":{"tmp":"tmp/signalk-edge-link_2.7.0_1779306313325_0.6831415733677717","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"2.8.0":{"name":"signalk-edge-link","version":"2.8.0","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"author":{"name":"Karl-Erik Gustafsson"},"license":"MIT","_id":"signalk-edge-link@2.8.0","maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"bin":{"edge-link-cli":"lib/bin/edge-link-cli.js"},"dist":{"shasum":"5c946d19b4a14674165cb54109700e32973f2351","tarball":"https://registry.npmjs.org/signalk-edge-link/-/signalk-edge-link-2.8.0.tgz","fileCount":62,"integrity":"sha512-5TRoSfQ6sP255oVr2e4LEIc4nfY8ZvPBLiwU2nYQeMR4M8dFrXdMp+gCUp7crWEl/FqX1nW1fMKMbmZjo+nRsw==","signatures":[{"sig":"MEYCIQCyF9ZvrS0WbtVvM3fC0pqQKlAQNCaPLc73bMzl3quk2gIhAITVNVpufMBfAT6nzAZpeN4SWvnMzhcB7k8PYMG8DHiY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2990432},"jest":{"testMatch":["**/__tests__/**/*.js","**/*.test.js","**/*.spec.js"],"transform":{".+\\.tsx$":["ts-jest",{"tsconfig":"tsconfig.webapp.json","diagnostics":false}],"^.+\\.js$":["babel-jest",{"presets":[["@babel/preset-env",{"targets":{"node":"current"}}]]}],"^.+\\.ts$":"ts-jest"},"testEnvironment":"node","coverageDirectory":"coverage","coverageThreshold":{"global":{"lines":65,"branches":60,"functions":65,"statements":65}},"collectCoverageFrom":["lib/**/*.js","!lib/webapp/**","!lib/components/**","!lib/utils/**"],"moduleFileExtensions":["ts","tsx","js","json","node"],"testPathIgnorePatterns":["/node_modules/","/public/"]},"main":"lib/index.js","engines":{"node":">=16"},"gitHead":"cef6bee84f4719d6a5a7f6d3376e29f33db656e9","scripts":{"cli":"node lib/bin/edge-link-cli.js","dev":"webpack --mode development --watch","lint":"eslint .","test":"jest --runInBand","build":"npm run build:ts && npm run build:web","format":"prettier --write \"**/*.{js,ts,json,md}\"","prepare":"husky","test:v2":"jest __tests__/v2/","build:ts":"npm run clean:lib && tsc","check:ts":"tsc --noEmit","lint:fix":"eslint . --fix","build:web":"npm run clean:public && webpack --mode production","clean:lib":"node -e \"const fs=require('fs');if(fs.existsSync('lib'))fs.rmSync('lib',{recursive:true,force:true});\"","test:watch":"jest --watch","clean:public":"node -e \"const fs=require('fs');if(fs.existsSync('public'))fs.rmSync('public',{recursive:true,force:true});\"","test:coverage":"jest --coverage","migrate:config":"node lib/scripts/migrate-config.js","test:integration":"jest test/integration/","check:release-docs":"node scripts/check-release-truth.js"},"signalk":{"appIcon":"./icons/icon-72x72.png","displayName":"Edge Link Configuration"},"_npmUser":{"name":"kgustafs","email":"ke.gustafsson@gmail.com"},"repository":{"url":"git+https://github.com/KEGustafsson/signalk-edge-link.git","type":"git"},"_npmVersion":"11.6.1","description":"SignalK Edge Link. Secure UDP link for data exchange.","directories":{},"lint-staged":{"*.js":["prettier --write","eslint --fix"],"*.ts":["prettier --write"],"*.{json,md}":["prettier --write"]},"_nodeVersion":"24.10.0","dependencies":{"@rjsf/core":"^5.18.4","@rjsf/utils":"^5.18.4","ping-monitor":"^0.8.2","@msgpack/msgpack":"^3.0.0","@rjsf/validator-ajv8":"^5.18.4"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","react":"^16.13.1","eslint":"^8.57.1","ts-jest":"^29.4.6","webpack":"^5.102.1","prettier":"^3.6.2","react-dom":"^16.13.1","ts-loader":"^9.5.4","css-loader":"^6.8.1","typescript":"^5.9.3","@babel/core":"^7.22.0","@types/node":"^25.3.5","lint-staged":"^15.4.3","webpack-cli":"^5.1.4","@types/react":"^16.14.0","babel-loader":"^9.1.2","style-loader":"^3.3.3","@types/react-dom":"^16.9.0","@babel/preset-env":"^7.22.0","@babel/preset-react":"^7.22.0","copy-webpack-plugin":"^14.0.0","eslint-plugin-react":"^7.37.5","html-webpack-plugin":"^5.5.3","react-test-renderer":"^16.14.0","@testing-library/react":"^12.1.5","jest-environment-jsdom":"^30.3.0","mini-css-extract-plugin":"^2.7.6","@testing-library/jest-dom":"^5.17.0"},"_npmOperationalInternal":{"tmp":"tmp/signalk-edge-link_2.8.0_1779380995818_0.8407717241108543","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"2.9.0":{"name":"signalk-edge-link","version":"2.9.0","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"author":{"name":"Karl-Erik Gustafsson"},"license":"MIT","_id":"signalk-edge-link@2.9.0","maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"bin":{"edge-link-cli":"lib/bin/edge-link-cli.js"},"dist":{"shasum":"21818be5e393f9e6a0c8cf187d51a44501386c8c","tarball":"https://registry.npmjs.org/signalk-edge-link/-/signalk-edge-link-2.9.0.tgz","fileCount":64,"integrity":"sha512-k5w5PnqAQKwPNS4uDgCgd22PnSlRK+nSZeAGK58B1ugo2/zoQpMzizEt64aNKYdbFENN+Ax6OSe50w9Go8vg9Q==","signatures":[{"sig":"MEYCIQCNvVRTdzLIFpimUPt4Oo/8XEvWDSHI35LOtoGGSVZG3AIhAJEQ+xuLDRaL4WkwEB8xoQGE1l7B9rFcEbn7YhoAEsxz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3040246},"jest":{"testMatch":["**/__tests__/**/*.js","**/*.test.js","**/*.spec.js"],"transform":{".+\\.tsx$":["ts-jest",{"tsconfig":"tsconfig.webapp.json","diagnostics":false}],"^.+\\.js$":["babel-jest",{"presets":[["@babel/preset-env",{"targets":{"node":"current"}}]]}],"^.+\\.ts$":"ts-jest"},"testEnvironment":"node","coverageDirectory":"coverage","coverageThreshold":{"global":{"lines":65,"branches":60,"functions":65,"statements":65}},"collectCoverageFrom":["lib/**/*.js","!lib/webapp/**","!lib/components/**","!lib/utils/**"],"moduleFileExtensions":["ts","tsx","js","json","node"],"testPathIgnorePatterns":["/node_modules/","/public/","/__tests__/benchmarks/","/__tests__/network-simulator\\.js$"]},"main":"lib/index.js","engines":{"node":">=16"},"gitHead":"da743643f04ab1ebc0ee205bd05e4be8a18ee2a9","scripts":{"cli":"node lib/bin/edge-link-cli.js","dev":"webpack --mode development --watch","lint":"eslint .","test":"jest --runInBand","build":"npm run build:ts && npm run build:web","format":"prettier --write \"**/*.{js,ts,json,md}\"","prepare":"husky","test:v2":"jest __tests__/v2/","build:ts":"npm run clean:lib && tsc","check:ts":"tsc --noEmit","lint:fix":"eslint . --fix","build:web":"npm run clean:public && webpack --mode production","clean:lib":"node -e \"const fs=require('fs');if(fs.existsSync('lib'))fs.rmSync('lib',{recursive:true,force:true});\"","test:watch":"jest --watch","clean:public":"node -e \"const fs=require('fs');if(fs.existsSync('public'))fs.rmSync('public',{recursive:true,force:true});\"","test:coverage":"jest --coverage","migrate:config":"node lib/scripts/migrate-config.js","test:integration":"jest __tests__/integration/","check:release-docs":"node scripts/check-release-truth.js"},"signalk":{"appIcon":"./icons/icon-72x72.png","displayName":"Edge Link Configuration"},"_npmUser":{"name":"kgustafs","email":"ke.gustafsson@gmail.com"},"repository":{"url":"git+https://github.com/KEGustafsson/signalk-edge-link.git","type":"git"},"_npmVersion":"11.6.1","description":"SignalK Edge Link. Secure UDP link for data exchange.","directories":{},"lint-staged":{"*.js":["prettier --write","eslint --fix"],"*.ts":["prettier --write"],"*.{json,md}":["prettier --write"]},"_nodeVersion":"24.10.0","dependencies":{"@rjsf/core":"^5.18.4","@rjsf/utils":"^5.18.4","ping-monitor":"^0.8.2","@msgpack/msgpack":"^3.0.0","@rjsf/validator-ajv8":"^5.18.4"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","react":"^16.13.1","eslint":"^8.57.1","ts-jest":"^29.4.6","webpack":"^5.102.1","prettier":"^3.6.2","react-dom":"^16.13.1","ts-loader":"^9.5.4","css-loader":"^6.8.1","typescript":"^5.9.3","@babel/core":"^7.22.0","@types/node":"^25.3.5","lint-staged":"^15.4.3","webpack-cli":"^5.1.4","@types/react":"^16.14.0","babel-loader":"^9.1.2","style-loader":"^3.3.3","@types/react-dom":"^16.9.0","@babel/preset-env":"^7.22.0","@babel/preset-react":"^7.22.0","copy-webpack-plugin":"^14.0.0","eslint-plugin-react":"^7.37.5","html-webpack-plugin":"^5.5.3","react-test-renderer":"^16.14.0","@testing-library/react":"^12.1.5","jest-environment-jsdom":"^30.3.0","mini-css-extract-plugin":"^2.7.6","@testing-library/jest-dom":"^5.17.0"},"_npmOperationalInternal":{"tmp":"tmp/signalk-edge-link_2.9.0_1780063531005_0.38194002373092295","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"2.9.1":{"name":"signalk-edge-link","version":"2.9.1","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"author":{"name":"Karl-Erik Gustafsson"},"license":"MIT","_id":"signalk-edge-link@2.9.1","maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"bin":{"edge-link-cli":"lib/bin/edge-link-cli.js"},"dist":{"shasum":"b47c74661b77f0f68b20cb9dadebe15bbef4bcb7","tarball":"https://registry.npmjs.org/signalk-edge-link/-/signalk-edge-link-2.9.1.tgz","fileCount":64,"integrity":"sha512-9P4s/ILYUrPGFuLdE3AzY5GcaYwex7myyDNIfuVOdWoMOqVjDC3NwpewntTHe7gXFe0xNj1pA9/tdPJsUr13Lw==","signatures":[{"sig":"MEQCIBsNFcH+btaOLJp6Vo18wvZO7DsnFGt+dRHfceoN7tNGAiB5lfdL6L7I9Qv42fYasOTM/68qDJYMwiAlvraf6NNE2w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3042433},"jest":{"testMatch":["**/__tests__/**/*.js","**/*.test.js","**/*.spec.js"],"transform":{".+\\.tsx$":["ts-jest",{"tsconfig":"tsconfig.webapp.json","diagnostics":false}],"^.+\\.js$":["babel-jest",{"presets":[["@babel/preset-env",{"targets":{"node":"current"}}]]}],"^.+\\.ts$":"ts-jest"},"testEnvironment":"node","coverageDirectory":"coverage","coverageThreshold":{"global":{"lines":65,"branches":60,"functions":65,"statements":65}},"collectCoverageFrom":["lib/**/*.js","!lib/webapp/**","!lib/components/**","!lib/utils/**"],"moduleFileExtensions":["ts","tsx","js","json","node"],"testPathIgnorePatterns":["/node_modules/","/public/","/__tests__/benchmarks/","/__tests__/network-simulator\\.js$"]},"main":"lib/index.js","engines":{"node":">=24"},"gitHead":"8387c8a106c479742726957885026a8dfa9bca7a","scripts":{"cli":"node lib/bin/edge-link-cli.js","dev":"webpack --mode development --watch","lint":"eslint .","test":"jest --runInBand","build":"npm run build:ts && npm run build:web","format":"prettier --write \"**/*.{js,ts,json,md}\"","prepare":"husky","test:v2":"jest __tests__/v2/","build:ts":"npm run clean:lib && tsc","check:ts":"tsc --noEmit","lint:fix":"eslint . --fix","build:web":"npm run clean:public && webpack --mode production","clean:lib":"node -e \"const fs=require('fs');if(fs.existsSync('lib'))fs.rmSync('lib',{recursive:true,force:true});\"","test:watch":"jest --watch","clean:public":"node -e \"const fs=require('fs');if(fs.existsSync('public'))fs.rmSync('public',{recursive:true,force:true});\"","test:coverage":"jest --coverage","migrate:config":"node lib/scripts/migrate-config.js","test:integration":"jest __tests__/integration/","check:release-docs":"node scripts/check-release-truth.js"},"signalk":{"appIcon":"./icons/icon-72x72.png","displayName":"Edge Link Configuration"},"_npmUser":{"name":"kgustafs","email":"ke.gustafsson@gmail.com"},"repository":{"url":"git+https://github.com/KEGustafsson/signalk-edge-link.git","type":"git"},"_npmVersion":"11.6.1","description":"SignalK Edge Link. Secure UDP link for data exchange.","directories":{},"lint-staged":{"*.js":["prettier --write","eslint --fix"],"*.ts":["prettier --write"],"*.{json,md}":["prettier --write"]},"_nodeVersion":"24.10.0","dependencies":{"@rjsf/core":"^5.18.4","@rjsf/utils":"^5.18.4","ping-monitor":"^0.8.2","@msgpack/msgpack":"^3.0.0","@rjsf/validator-ajv8":"^5.18.4"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","react":"^16.13.1","eslint":"^8.57.1","ts-jest":"^29.4.6","webpack":"^5.102.1","prettier":"^3.6.2","react-dom":"^16.13.1","ts-loader":"^9.5.4","css-loader":"^6.8.1","typescript":"^5.9.3","@babel/core":"^7.22.0","@types/node":"^25.3.5","lint-staged":"^15.4.3","webpack-cli":"^5.1.4","@types/react":"^16.14.0","babel-loader":"^9.1.2","style-loader":"^3.3.3","@types/react-dom":"^16.9.0","@babel/preset-env":"^7.22.0","@babel/preset-react":"^7.22.0","copy-webpack-plugin":"^14.0.0","eslint-plugin-react":"^7.37.5","html-webpack-plugin":"^5.5.3","react-test-renderer":"^16.14.0","@testing-library/react":"^12.1.5","jest-environment-jsdom":"^30.3.0","mini-css-extract-plugin":"^2.7.6","@testing-library/jest-dom":"^5.17.0"},"_npmOperationalInternal":{"tmp":"tmp/signalk-edge-link_2.9.1_1780785729696_0.871270768279182","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"3.0.0":{"name":"signalk-edge-link","version":"3.0.0","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"author":{"name":"Karl-Erik Gustafsson"},"license":"MIT","_id":"signalk-edge-link@3.0.0","maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"bin":{"edge-link-cli":"lib/bin/edge-link-cli.js"},"dist":{"shasum":"97d67bcd76416273ef442082acb1e32e231274f1","tarball":"https://registry.npmjs.org/signalk-edge-link/-/signalk-edge-link-3.0.0.tgz","fileCount":128,"integrity":"sha512-9Y9Q8OdmhgAHQwEBvJTXm0hDW9jvVzFJknSnCbEB3Ev3stdHUawuUa6utBCspVgjw3dVKlWRMFtXP4iIKp2Qhg==","signatures":[{"sig":"MEUCIQD6K/eDzNIy6SkdIW8HnkxR2KTM1Qq+Simq4oexnlZtggIgTGZ3OOGEdWxXVbxXYLE/Wa1rK4PnaxbB+R+OLKttWZA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1450414},"jest":{"testMatch":["**/__tests__/**/*.js","**/__conformance__/**/*.test.js","**/*.test.js","**/*.spec.js","**/*.test.ts","**/*.test.tsx"],"transform":{"^.+\\.js$":["babel-jest",{"presets":[["@babel/preset-env",{"targets":{"node":"current"}}]]}],"^.+\\.(ts|tsx)$":["ts-jest",{"tsconfig":"tsconfig.jest.json","diagnostics":false,"isolatedModules":true}]},"testEnvironment":"node","moduleNameMapper":{"^(?:\\.\\./)+lib/(.*)$":"<rootDir>/src/$1","^(?:\\.\\./)+lib/types$":"<rootDir>/src/foundation/types/index","^(?:\\.\\./)+lib/crypto$":"<rootDir>/src/codec/crypto","^(?:\\.\\./)+lib/packet$":"<rootDir>/src/codec/packet-codec","^(?:\\.\\./)+lib/bonding$":"<rootDir>/src/transport/bonding","^(?:\\.\\./)+lib/metrics$":"<rootDir>/src/domain/metrics/registry","^(?:\\.\\./)+lib/metadata$":"<rootDir>/src/codec/metadata-codec","^(?:\\.\\./)+lib/pipeline$":"<rootDir>/src/transport/pipeline/v1","^(?:\\.\\./)+lib/sequence$":"<rootDir>/src/transport/reliability/sequence","^(?:\\.\\./)+lib/config-io$":"<rootDir>/src/foundation/config-io","^(?:\\.\\./)+lib/constants$":"<rootDir>/src/foundation/constants","^(?:\\.\\./)+lib/congestion$":"<rootDir>/src/transport/congestion","^(?:\\.\\./)+lib/monitoring$":"<rootDir>/src/domain/monitoring/index","^(?:\\.\\./)+lib/prometheus$":"<rootDir>/src/domain/metrics/prometheus","^(?:\\.\\./)+lib/value-dedup$":"<rootDir>/src/codec/value-dedup","^(?:\\.\\./)+lib/compact-delta$":"<rootDir>/src/codec/compact-delta","^(?:\\.\\./)+lib/config-reload$":"<rootDir>/src/foundation/config-reload","^(?:\\.\\./)+lib/CircularBuffer$":"<rootDir>/src/foundation/circular-buffer","^(?:\\.\\./)+lib/config-watcher$":"<rootDir>/src/app/config/watcher","^(?:\\.\\./)+lib/packet-capture$":"<rootDir>/src/domain/monitoring/packet-capture","^(?:\\.\\./)+lib/pathDictionary$":"<rootDir>/src/codec/path-dictionary","^(?:\\.\\./)+lib/pipeline-utils$":"<rootDir>/src/codec/compression","^(?:\\.\\./)+lib/delta-sanitizer$":"<rootDir>/src/codec/delta-sanitizer","^(?:\\.\\./)+lib/source-dispatch$":"<rootDir>/src/codec/source-dispatch","^(?:\\.\\./)+lib/source-snapshot$":"<rootDir>/src/codec/source-snapshot","^(?:\\.\\./)+lib/values-snapshot$":"<rootDir>/src/codec/values-snapshot","^(?:\\.\\./)+lib/pipeline-factory$":"<rootDir>/src/transport/pipeline/factory","^(?:\\.\\./)+lib/retransmit-queue$":"<rootDir>/src/transport/reliability/retransmit-queue","^(?:\\.\\./)+lib/metrics-publisher$":"<rootDir>/src/transport/metrics/publisher","^(?:\\.\\./)+lib/pipeline-v2-client$":"<rootDir>/src/transport/pipeline/reliable-client","^(?:\\.\\./)+lib/pipeline-v2-server$":"<rootDir>/src/transport/pipeline/reliable-server","^(?:\\.\\./)+lib/source-replication$":"<rootDir>/src/domain/source-registry","^(?:\\.\\./)+lib/transport/udp-socket-manager$":"<rootDir>/src/transport/udp-socket-manager"},"coverageDirectory":"coverage","coverageThreshold":{"global":{"lines":65,"branches":60,"functions":65,"statements":65},"./src/webapp/components/cards/":{"lines":70,"branches":65,"functions":60,"statements":70},"./src/transport/pipeline/v1-helpers.ts":{"lines":65,"branches":60,"functions":40,"statements":65}},"setupFilesAfterEnv":["<rootDir>/jest.setup.ts"],"collectCoverageFrom":["src/**/*.ts","src/**/*.tsx","!src/**/*.d.ts"],"moduleFileExtensions":["ts","tsx","js","json","node"],"testPathIgnorePatterns":["/node_modules/","/public/","/__tests__/benchmarks/","/__tests__/helpers/","/__tests__/network-simulator\\.js$","/__conformance__/(?:generate-vectors|build-vectors)\\.js$"]},"main":"lib/index.js","engines":{"node":">=20.9.0"},"gitHead":"3eec3cdbc3c5200325514cd81e39f9a6e35a16dc","scripts":{"cli":"node lib/bin/edge-link-cli.js","dev":"webpack --mode development --watch","lint":"eslint . --ext .js,.jsx,.ts,.tsx --max-warnings 0","test":"jest --runInBand","build":"npm run build:ts && npm run build:web","format":"prettier --write \"**/*.{js,ts,json,md}\"","verify":"npm run check:ts && npm run lint && npm test","prepack":"npm run build","prepare":"husky","test:v2":"jest __tests__/v2/","build:ts":"npm run clean:lib && tsc","check:ts":"tsc --noEmit","lint:fix":"eslint . --ext .js,.jsx,.ts,.tsx --fix","build:web":"npm run clean:public && webpack --mode production","clean:lib":"node -e \"const fs=require('fs');if(fs.existsSync('lib'))fs.rmSync('lib',{recursive:true,force:true});\"","test:watch":"jest --watch","clean:public":"node -e \"const fs=require('fs');if(fs.existsSync('public'))fs.rmSync('public',{recursive:true,force:true});\"","test:coverage":"jest --coverage","migrate:config":"node lib/scripts/migrate-config.js","check:ts:webapp":"tsc -p tsconfig.webapp.json --noEmit","verify:ci-local":"npm run check:ts && npm run lint && npm run test:coverage && npm run check:ts:webapp && npm run build && npm run conformance:generate && git diff --exit-code -- __conformance__/vectors/golden.json && npm run check:release-docs","test:integration":"jest __tests__/integration/","check:release-docs":"node scripts/check-release-truth.js","conformance:generate":"npm run build:ts && node __conformance__/generate-vectors.js"},"signalk":{"appIcon":"./icons/icon-72x72.png","displayName":"Edge Link Configuration"},"_npmUser":{"name":"kgustafs","email":"ke.gustafsson@gmail.com"},"overrides":{"ws":"8.21.0","js-yaml":"4.2.0"},"repository":{"url":"git+https://github.com/KEGustafsson/signalk-edge-link.git","type":"git"},"_npmVersion":"11.6.1","description":"SignalK Edge Link. Secure UDP link for data exchange.","directories":{},"lint-staged":{"*.{js,jsx}":["prettier --write","eslint --fix"],"*.{ts,tsx}":["prettier --write","eslint --fix"],"*.{json,md}":["prettier --write"]},"_nodeVersion":"24.10.0","dependencies":{"ping-monitor":"^0.8.2","@msgpack/msgpack":"^3.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","react":"^19.0.0","eslint":"^8.57.1","ts-jest":"^29.4.6","webpack":"^5.102.1","prettier":"^3.6.2","react-dom":"^19.0.0","ts-loader":"^9.5.4","@rjsf/core":"^5.18.4","css-loader":"^6.8.1","typescript":"^5.9.3","@babel/core":"^7.29.7","@rjsf/utils":"^5.18.4","@types/node":"^25.3.5","lint-staged":"^15.4.3","webpack-cli":"^5.1.4","@types/react":"^19.0.0","babel-loader":"^9.1.2","style-loader":"^3.3.3","@types/react-dom":"^19.0.0","@babel/preset-env":"^7.22.0","@babel/preset-react":"^7.22.0","copy-webpack-plugin":"^14.0.0","eslint-plugin-react":"^7.37.5","html-webpack-plugin":"^5.5.3","react-test-renderer":"^19.0.0","@rjsf/validator-ajv8":"^5.18.4","@testing-library/dom":"^10.4.1","@testing-library/react":"^16.0.0","jest-environment-jsdom":"^30.3.0","mini-css-extract-plugin":"^2.7.6","@testing-library/jest-dom":"^6.0.0","@typescript-eslint/parser":"^7.18.0","@typescript-eslint/eslint-plugin":"^7.18.0"},"_npmOperationalInternal":{"tmp":"tmp/signalk-edge-link_3.0.0_1782576720148_0.527939093315476","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"3.1.0":{"name":"signalk-edge-link","version":"3.1.0","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"author":{"name":"Karl-Erik Gustafsson"},"license":"MIT","_id":"signalk-edge-link@3.1.0","maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"bin":{"edge-link-cli":"lib/bin/edge-link-cli.js"},"dist":{"shasum":"a60ffc9913d466748f95cbf720032b51ee153710","tarball":"https://registry.npmjs.org/signalk-edge-link/-/signalk-edge-link-3.1.0.tgz","fileCount":128,"integrity":"sha512-XUCw0pMXMJFXN2y4AVp++brdaSdGWnJ91Fb1VAIRyJz7XNtt7K20tgwiIHwanIe69Bqz6GPb0qm6ZDKJy9LSxQ==","signatures":[{"sig":"MEQCIAKk/aTcMMFbQVpSmZmJ0GYAkGWRWvVkvJ4OIie9o84cAiB/GTslx80iYoeAxzjj1sIplX20jl9cm+302G4Wlt7j7g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1458449},"jest":{"testMatch":["**/__tests__/**/*.js","**/__conformance__/**/*.test.js","**/*.test.js","**/*.spec.js","**/*.test.ts","**/*.test.tsx"],"transform":{"^.+\\.js$":["babel-jest",{"presets":[["@babel/preset-env",{"targets":{"node":"current"}}]]}],"^.+\\.(ts|tsx)$":["ts-jest",{"tsconfig":"tsconfig.jest.json","diagnostics":false,"isolatedModules":true}]},"testEnvironment":"node","moduleNameMapper":{"^(?:\\.\\./)+lib/(.*)$":"<rootDir>/src/$1","^(?:\\.\\./)+lib/types$":"<rootDir>/src/foundation/types/index","^(?:\\.\\./)+lib/crypto$":"<rootDir>/src/codec/crypto","^(?:\\.\\./)+lib/packet$":"<rootDir>/src/codec/packet-codec","^(?:\\.\\./)+lib/bonding$":"<rootDir>/src/transport/bonding","^(?:\\.\\./)+lib/metrics$":"<rootDir>/src/domain/metrics/registry","^(?:\\.\\./)+lib/metadata$":"<rootDir>/src/codec/metadata-codec","^(?:\\.\\./)+lib/pipeline$":"<rootDir>/src/transport/pipeline/v1","^(?:\\.\\./)+lib/sequence$":"<rootDir>/src/transport/reliability/sequence","^(?:\\.\\./)+lib/config-io$":"<rootDir>/src/foundation/config-io","^(?:\\.\\./)+lib/constants$":"<rootDir>/src/foundation/constants","^(?:\\.\\./)+lib/congestion$":"<rootDir>/src/transport/congestion","^(?:\\.\\./)+lib/monitoring$":"<rootDir>/src/domain/monitoring/index","^(?:\\.\\./)+lib/prometheus$":"<rootDir>/src/domain/metrics/prometheus","^(?:\\.\\./)+lib/value-dedup$":"<rootDir>/src/codec/value-dedup","^(?:\\.\\./)+lib/compact-delta$":"<rootDir>/src/codec/compact-delta","^(?:\\.\\./)+lib/config-reload$":"<rootDir>/src/foundation/config-reload","^(?:\\.\\./)+lib/CircularBuffer$":"<rootDir>/src/foundation/circular-buffer","^(?:\\.\\./)+lib/config-watcher$":"<rootDir>/src/app/config/watcher","^(?:\\.\\./)+lib/packet-capture$":"<rootDir>/src/domain/monitoring/packet-capture","^(?:\\.\\./)+lib/pathDictionary$":"<rootDir>/src/codec/path-dictionary","^(?:\\.\\./)+lib/pipeline-utils$":"<rootDir>/src/codec/compression","^(?:\\.\\./)+lib/delta-sanitizer$":"<rootDir>/src/codec/delta-sanitizer","^(?:\\.\\./)+lib/source-dispatch$":"<rootDir>/src/codec/source-dispatch","^(?:\\.\\./)+lib/source-snapshot$":"<rootDir>/src/codec/source-snapshot","^(?:\\.\\./)+lib/values-snapshot$":"<rootDir>/src/codec/values-snapshot","^(?:\\.\\./)+lib/pipeline-factory$":"<rootDir>/src/transport/pipeline/factory","^(?:\\.\\./)+lib/retransmit-queue$":"<rootDir>/src/transport/reliability/retransmit-queue","^(?:\\.\\./)+lib/metrics-publisher$":"<rootDir>/src/transport/metrics/publisher","^(?:\\.\\./)+lib/pipeline-v2-client$":"<rootDir>/src/transport/pipeline/reliable-client","^(?:\\.\\./)+lib/pipeline-v2-server$":"<rootDir>/src/transport/pipeline/reliable-server","^(?:\\.\\./)+lib/source-replication$":"<rootDir>/src/domain/source-registry","^(?:\\.\\./)+lib/transport/udp-socket-manager$":"<rootDir>/src/transport/udp-socket-manager"},"coverageDirectory":"coverage","coverageThreshold":{"global":{"lines":65,"branches":60,"functions":65,"statements":65},"./src/webapp/components/cards/":{"lines":70,"branches":65,"functions":60,"statements":70},"./src/transport/pipeline/v1-helpers.ts":{"lines":65,"branches":60,"functions":40,"statements":65}},"setupFilesAfterEnv":["<rootDir>/jest.setup.ts"],"collectCoverageFrom":["src/**/*.ts","src/**/*.tsx","!src/**/*.d.ts"],"moduleFileExtensions":["ts","tsx","js","json","node"],"testPathIgnorePatterns":["/node_modules/","/public/","/__tests__/benchmarks/","/__tests__/helpers/","/__tests__/network-simulator\\.js$","/__conformance__/(?:generate-vectors|build-vectors)\\.js$"]},"main":"lib/index.js","engines":{"node":">=20.9.0"},"gitHead":"de6aa24a9154d5f95cf9918433aa360df0be6cf4","scripts":{"cli":"node lib/bin/edge-link-cli.js","dev":"webpack --mode development --watch","lint":"eslint . --ext .js,.jsx,.ts,.tsx --max-warnings 0","test":"jest --runInBand","build":"npm run build:ts && npm run build:web","format":"prettier --write \"**/*.{js,ts,json,md}\"","verify":"npm run check:ts && npm run lint && npm test","prepack":"npm run build","prepare":"husky","test:v2":"jest __tests__/v2/","build:ts":"npm run clean:lib && tsc","check:ts":"tsc --noEmit","lint:fix":"eslint . --ext .js,.jsx,.ts,.tsx --fix","build:web":"npm run clean:public && webpack --mode production","clean:lib":"node -e \"const fs=require('fs');if(fs.existsSync('lib'))fs.rmSync('lib',{recursive:true,force:true});\"","test:watch":"jest --watch","clean:public":"node -e \"const fs=require('fs');if(fs.existsSync('public'))fs.rmSync('public',{recursive:true,force:true});\"","test:coverage":"jest --coverage","migrate:config":"node lib/scripts/migrate-config.js","check:ts:webapp":"tsc -p tsconfig.webapp.json --noEmit","verify:ci-local":"npm run check:ts && npm run lint && npm run test:coverage && npm run check:ts:webapp && npm run build && npm run conformance:generate && git diff --exit-code -- __conformance__/vectors/golden.json && npm run check:release-docs","test:integration":"jest __tests__/integration/","check:release-docs":"node scripts/check-release-truth.js","conformance:generate":"npm run build:ts && node __conformance__/generate-vectors.js"},"signalk":{"appIcon":"./icons/icon-72x72.png","displayName":"Edge Link Configuration"},"_npmUser":{"name":"kgustafs","email":"ke.gustafsson@gmail.com"},"overrides":{"ws":"8.21.0","js-yaml":"4.2.0"},"repository":{"url":"git+https://github.com/KEGustafsson/signalk-edge-link.git","type":"git"},"_npmVersion":"11.6.1","description":"SignalK Edge Link. Secure UDP link for data exchange.","directories":{},"lint-staged":{"*.{js,jsx}":["prettier --write","eslint --fix"],"*.{ts,tsx}":["prettier --write","eslint --fix"],"*.{json,md}":["prettier --write"]},"_nodeVersion":"24.10.0","dependencies":{"ping-monitor":"^0.8.2","@msgpack/msgpack":"^3.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","react":"^19.0.0","eslint":"^8.57.1","ts-jest":"^29.4.6","webpack":"^5.102.1","prettier":"^3.6.2","react-dom":"^19.0.0","ts-loader":"^9.5.4","@rjsf/core":"^5.18.4","css-loader":"^6.8.1","typescript":"^5.9.3","@babel/core":"^7.29.7","@rjsf/utils":"^5.18.4","@types/node":"^25.3.5","lint-staged":"^15.4.3","webpack-cli":"^5.1.4","@types/react":"^19.0.0","babel-loader":"^9.1.2","style-loader":"^3.3.3","@types/react-dom":"^19.0.0","@babel/preset-env":"^7.22.0","@babel/preset-react":"^7.22.0","copy-webpack-plugin":"^14.0.0","eslint-plugin-react":"^7.37.5","html-webpack-plugin":"^5.5.3","react-test-renderer":"^19.0.0","@rjsf/validator-ajv8":"^5.18.4","@testing-library/dom":"^10.4.1","@testing-library/react":"^16.0.0","jest-environment-jsdom":"^30.3.0","mini-css-extract-plugin":"^2.7.6","@testing-library/jest-dom":"^6.0.0","@typescript-eslint/parser":"^7.18.0","@typescript-eslint/eslint-plugin":"^7.18.0"},"_npmOperationalInternal":{"tmp":"tmp/signalk-edge-link_3.1.0_1783003341563_0.5625278028971374","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"4.0.0":{"name":"signalk-edge-link","version":"4.0.0","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"author":{"name":"Karl-Erik Gustafsson"},"license":"MIT","_id":"signalk-edge-link@4.0.0","maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"bin":{"edge-link-cli":"lib/bin/edge-link-cli.js"},"dist":{"shasum":"d0e197c230a93a785bfac1b179e0a00a73021a6e","tarball":"https://registry.npmjs.org/signalk-edge-link/-/signalk-edge-link-4.0.0.tgz","fileCount":128,"integrity":"sha512-ljtHAgY9+DnwAPDFbf/nErvXucdY72+uZF+EVK96WqASaDlwjukkGI2B7q9DzRSRl6zP1SqANyxy/butyXEhPA==","signatures":[{"sig":"MEUCIQDUOtwBgX0VLEJnavBTcb4GJJUGoPjN1EujJkC1GjwfNwIgChFQQeFbqyfvO2gqeN2per+OqX3MpAm+zWZ7dgk8KsM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1549139},"jest":{"testMatch":["**/__tests__/**/*.js","**/__conformance__/**/*.test.js","**/*.test.js","**/*.spec.js","**/*.test.ts","**/*.test.tsx"],"transform":{"^.+\\.js$":["babel-jest",{"presets":[["@babel/preset-env",{"targets":{"node":"current"}}]]}],"^.+\\.(ts|tsx)$":["ts-jest",{"tsconfig":"tsconfig.jest.json","diagnostics":false,"isolatedModules":true}]},"testEnvironment":"node","moduleNameMapper":{"^(?:\\.\\./)+lib/(.*)$":"<rootDir>/src/$1","^(?:\\.\\./)+lib/types$":"<rootDir>/src/foundation/types/index","^(?:\\.\\./)+lib/crypto$":"<rootDir>/src/codec/crypto","^(?:\\.\\./)+lib/packet$":"<rootDir>/src/codec/packet-codec","^(?:\\.\\./)+lib/bonding$":"<rootDir>/src/transport/bonding","^(?:\\.\\./)+lib/metrics$":"<rootDir>/src/domain/metrics/registry","^(?:\\.\\./)+lib/metadata$":"<rootDir>/src/codec/metadata-codec","^(?:\\.\\./)+lib/pipeline$":"<rootDir>/src/transport/pipeline/v1","^(?:\\.\\./)+lib/sequence$":"<rootDir>/src/transport/reliability/sequence","^(?:\\.\\./)+lib/config-io$":"<rootDir>/src/foundation/config-io","^(?:\\.\\./)+lib/constants$":"<rootDir>/src/foundation/constants","^(?:\\.\\./)+lib/congestion$":"<rootDir>/src/transport/congestion","^(?:\\.\\./)+lib/monitoring$":"<rootDir>/src/domain/monitoring/index","^(?:\\.\\./)+lib/prometheus$":"<rootDir>/src/domain/metrics/prometheus","^(?:\\.\\./)+lib/value-dedup$":"<rootDir>/src/codec/value-dedup","^(?:\\.\\./)+lib/compact-delta$":"<rootDir>/src/codec/compact-delta","^(?:\\.\\./)+lib/config-reload$":"<rootDir>/src/foundation/config-reload","^(?:\\.\\./)+lib/CircularBuffer$":"<rootDir>/src/foundation/circular-buffer","^(?:\\.\\./)+lib/config-watcher$":"<rootDir>/src/app/config/watcher","^(?:\\.\\./)+lib/packet-capture$":"<rootDir>/src/domain/monitoring/packet-capture","^(?:\\.\\./)+lib/pathDictionary$":"<rootDir>/src/codec/path-dictionary","^(?:\\.\\./)+lib/pipeline-utils$":"<rootDir>/src/codec/compression","^(?:\\.\\./)+lib/delta-sanitizer$":"<rootDir>/src/codec/delta-sanitizer","^(?:\\.\\./)+lib/source-dispatch$":"<rootDir>/src/codec/source-dispatch","^(?:\\.\\./)+lib/source-snapshot$":"<rootDir>/src/codec/source-snapshot","^(?:\\.\\./)+lib/values-snapshot$":"<rootDir>/src/codec/values-snapshot","^(?:\\.\\./)+lib/pipeline-factory$":"<rootDir>/src/transport/pipeline/factory","^(?:\\.\\./)+lib/retransmit-queue$":"<rootDir>/src/transport/reliability/retransmit-queue","^(?:\\.\\./)+lib/metrics-publisher$":"<rootDir>/src/transport/metrics/publisher","^(?:\\.\\./)+lib/pipeline-v2-client$":"<rootDir>/src/transport/pipeline/reliable-client","^(?:\\.\\./)+lib/pipeline-v2-server$":"<rootDir>/src/transport/pipeline/reliable-server","^(?:\\.\\./)+lib/source-replication$":"<rootDir>/src/domain/source-registry","^(?:\\.\\./)+lib/transport/udp-socket-manager$":"<rootDir>/src/transport/udp-socket-manager"},"coverageDirectory":"coverage","coverageThreshold":{"global":{"lines":65,"branches":60,"functions":65,"statements":65},"./src/webapp/components/cards/":{"lines":70,"branches":65,"functions":60,"statements":70},"./src/transport/pipeline/v1-helpers.ts":{"lines":65,"branches":60,"functions":40,"statements":65}},"setupFilesAfterEnv":["<rootDir>/jest.setup.ts"],"collectCoverageFrom":["src/**/*.ts","src/**/*.tsx","!src/**/*.d.ts"],"moduleFileExtensions":["ts","tsx","js","json","node"],"testPathIgnorePatterns":["/node_modules/","/public/","/__tests__/benchmarks/","/__tests__/helpers/","/__tests__/network-simulator\\.js$","/__conformance__/(?:generate-vectors|build-vectors)\\.js$"]},"main":"lib/index.js","engines":{"node":">=20.9.0"},"gitHead":"95b1333c09c1c61025d28b0c1054101e4d41b13f","scripts":{"cli":"node lib/bin/edge-link-cli.js","dev":"webpack --mode development --watch","lint":"eslint . --ext .js,.jsx,.ts,.tsx --max-warnings 0","test":"jest --runInBand","build":"npm run build:ts && npm run build:web","format":"prettier --write \"**/*.{js,jsx,ts,tsx,json,md}\"","verify":"npm run check:ts && npm run lint && npm test","prepack":"npm run build","prepare":"husky","test:v2":"jest __tests__/v2/","build:ts":"npm run clean:lib && tsc","check:ts":"tsc --noEmit","lint:fix":"eslint . --ext .js,.jsx,.ts,.tsx --fix","build:web":"npm run clean:public && webpack --mode production","clean:lib":"node -e \"const fs=require('fs');if(fs.existsSync('lib'))fs.rmSync('lib',{recursive:true,force:true});\"","test:watch":"jest --watch","clean:public":"node -e \"const fs=require('fs');if(fs.existsSync('public'))fs.rmSync('public',{recursive:true,force:true});\"","format:check":"prettier --check \"**/*.{js,jsx,ts,tsx,json,md}\"","test:coverage":"jest --coverage --runInBand","migrate:config":"node lib/scripts/migrate-config.js","check:ts:webapp":"tsc -p tsconfig.webapp.json --noEmit","verify:ci-local":"npm run check:ts && npm run lint && npm run test:coverage && npm run check:ts:webapp && npm run build && npm run conformance:generate && git diff --exit-code -- __conformance__/vectors/golden.json && npm run check:release-docs","test:integration":"jest __tests__/integration/","check:release-docs":"node scripts/check-release-truth.js","conformance:generate":"npm run build:ts && node __conformance__/generate-vectors.js"},"signalk":{"appIcon":"./icons/icon-72x72.png","displayName":"Edge Link Configuration"},"_npmUser":{"name":"kgustafs","email":"ke.gustafsson@gmail.com"},"overrides":{"ws":"8.21.0","js-yaml":"4.3.0"},"repository":{"url":"git+https://github.com/KEGustafsson/signalk-edge-link.git","type":"git"},"_npmVersion":"11.6.1","description":"SignalK Edge Link. Secure UDP link for data exchange.","directories":{},"lint-staged":{"*.{js,jsx}":["prettier --write","eslint --fix"],"*.{ts,tsx}":["prettier --write","eslint --fix"],"*.{json,md}":["prettier --write"]},"_nodeVersion":"24.10.0","dependencies":{"ping-monitor":"^0.8.2","@msgpack/msgpack":"^3.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","react":"^19.0.0","eslint":"^8.57.1","ts-jest":"^29.4.6","webpack":"^5.102.1","prettier":"^3.6.2","react-dom":"^19.0.0","ts-loader":"^9.5.4","@rjsf/core":"^5.18.4","css-loader":"^6.8.1","typescript":"^5.9.3","@babel/core":"^7.29.7","@rjsf/utils":"^5.18.4","@types/node":"^25.3.5","lint-staged":"^15.4.3","webpack-cli":"^5.1.4","@types/react":"^19.0.0","babel-loader":"^9.1.2","style-loader":"^3.3.3","@types/react-dom":"^19.0.0","@babel/preset-env":"^7.22.0","@babel/preset-react":"^7.22.0","copy-webpack-plugin":"^14.0.0","eslint-plugin-react":"^7.37.5","html-webpack-plugin":"^5.5.3","react-test-renderer":"^19.0.0","@rjsf/validator-ajv8":"^5.18.4","@testing-library/dom":"^10.4.1","@testing-library/react":"^16.0.0","jest-environment-jsdom":"^30.3.0","mini-css-extract-plugin":"^2.7.6","@testing-library/jest-dom":"^6.0.0","@typescript-eslint/parser":"^7.18.0","@typescript-eslint/eslint-plugin":"^7.18.0"},"_npmOperationalInternal":{"tmp":"tmp/signalk-edge-link_4.0.0_1785522850042_0.2783853600200772","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"4.0.1":{"name":"signalk-edge-link","version":"4.0.1","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"author":{"name":"Karl-Erik Gustafsson"},"license":"MIT","_id":"signalk-edge-link@4.0.1","maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"bin":{"edge-link-cli":"lib/bin/edge-link-cli.js"},"dist":{"shasum":"087ce712f355749f669d73d3cbead9e647aa4f2a","tarball":"https://registry.npmjs.org/signalk-edge-link/-/signalk-edge-link-4.0.1.tgz","fileCount":128,"integrity":"sha512-zif7S+mRVeIs18Iz7T34CykSFMcMJrl6ucujrhQB/mMVddCZBYl4BiO7tTQtMpma6ULrghRlEAtoLO495TqIQg==","signatures":[{"sig":"MEYCIQDovLhcIXdns3xfaeg7jRBweKw2DpiJD7STSIR2dV9Q1QIhANpQTkYm0BkftbxnC13UfQk5gIZSSVNGGCoYRPHq4GtM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1549139},"jest":{"testMatch":["**/__tests__/**/*.js","**/__conformance__/**/*.test.js","**/*.test.js","**/*.spec.js","**/*.test.ts","**/*.test.tsx"],"transform":{"^.+\\.js$":["babel-jest",{"presets":[["@babel/preset-env",{"targets":{"node":"current"}}]]}],"^.+\\.(ts|tsx)$":["ts-jest",{"tsconfig":"tsconfig.jest.json","diagnostics":false,"isolatedModules":true}]},"testEnvironment":"node","moduleNameMapper":{"^(?:\\.\\./)+lib/(.*)$":"<rootDir>/src/$1","^(?:\\.\\./)+lib/types$":"<rootDir>/src/foundation/types/index","^(?:\\.\\./)+lib/crypto$":"<rootDir>/src/codec/crypto","^(?:\\.\\./)+lib/packet$":"<rootDir>/src/codec/packet-codec","^(?:\\.\\./)+lib/bonding$":"<rootDir>/src/transport/bonding","^(?:\\.\\./)+lib/metrics$":"<rootDir>/src/domain/metrics/registry","^(?:\\.\\./)+lib/metadata$":"<rootDir>/src/codec/metadata-codec","^(?:\\.\\./)+lib/pipeline$":"<rootDir>/src/transport/pipeline/v1","^(?:\\.\\./)+lib/sequence$":"<rootDir>/src/transport/reliability/sequence","^(?:\\.\\./)+lib/config-io$":"<rootDir>/src/foundation/config-io","^(?:\\.\\./)+lib/constants$":"<rootDir>/src/foundation/constants","^(?:\\.\\./)+lib/congestion$":"<rootDir>/src/transport/congestion","^(?:\\.\\./)+lib/monitoring$":"<rootDir>/src/domain/monitoring/index","^(?:\\.\\./)+lib/prometheus$":"<rootDir>/src/domain/metrics/prometheus","^(?:\\.\\./)+lib/value-dedup$":"<rootDir>/src/codec/value-dedup","^(?:\\.\\./)+lib/compact-delta$":"<rootDir>/src/codec/compact-delta","^(?:\\.\\./)+lib/config-reload$":"<rootDir>/src/foundation/config-reload","^(?:\\.\\./)+lib/CircularBuffer$":"<rootDir>/src/foundation/circular-buffer","^(?:\\.\\./)+lib/config-watcher$":"<rootDir>/src/app/config/watcher","^(?:\\.\\./)+lib/packet-capture$":"<rootDir>/src/domain/monitoring/packet-capture","^(?:\\.\\./)+lib/pathDictionary$":"<rootDir>/src/codec/path-dictionary","^(?:\\.\\./)+lib/pipeline-utils$":"<rootDir>/src/codec/compression","^(?:\\.\\./)+lib/delta-sanitizer$":"<rootDir>/src/codec/delta-sanitizer","^(?:\\.\\./)+lib/source-dispatch$":"<rootDir>/src/codec/source-dispatch","^(?:\\.\\./)+lib/source-snapshot$":"<rootDir>/src/codec/source-snapshot","^(?:\\.\\./)+lib/values-snapshot$":"<rootDir>/src/codec/values-snapshot","^(?:\\.\\./)+lib/pipeline-factory$":"<rootDir>/src/transport/pipeline/factory","^(?:\\.\\./)+lib/retransmit-queue$":"<rootDir>/src/transport/reliability/retransmit-queue","^(?:\\.\\./)+lib/metrics-publisher$":"<rootDir>/src/transport/metrics/publisher","^(?:\\.\\./)+lib/pipeline-v2-client$":"<rootDir>/src/transport/pipeline/reliable-client","^(?:\\.\\./)+lib/pipeline-v2-server$":"<rootDir>/src/transport/pipeline/reliable-server","^(?:\\.\\./)+lib/source-replication$":"<rootDir>/src/domain/source-registry","^(?:\\.\\./)+lib/transport/udp-socket-manager$":"<rootDir>/src/transport/udp-socket-manager"},"coverageDirectory":"coverage","coverageThreshold":{"global":{"lines":65,"branches":60,"functions":65,"statements":65},"./src/webapp/components/cards/":{"lines":70,"branches":65,"functions":60,"statements":70},"./src/transport/pipeline/v1-helpers.ts":{"lines":65,"branches":60,"functions":40,"statements":65}},"setupFilesAfterEnv":["<rootDir>/jest.setup.ts"],"collectCoverageFrom":["src/**/*.ts","src/**/*.tsx","!src/**/*.d.ts"],"moduleFileExtensions":["ts","tsx","js","json","node"],"testPathIgnorePatterns":["/node_modules/","/public/","/__tests__/benchmarks/","/__tests__/helpers/","/__tests__/network-simulator\\.js$","/__conformance__/(?:generate-vectors|build-vectors)\\.js$"]},"main":"lib/index.js","engines":{"node":">=20.9.0"},"gitHead":"5703a7409d4f8e917c781a53607463e9b1772042","scripts":{"cli":"node lib/bin/edge-link-cli.js","dev":"webpack --mode development --watch","lint":"eslint . --ext .js,.jsx,.ts,.tsx --max-warnings 0","test":"jest --runInBand","build":"npm run build:ts && npm run build:web","format":"prettier --write \"**/*.{js,jsx,ts,tsx,json,md}\"","verify":"npm run check:ts && npm run lint && npm test","prepack":"npm run build","prepare":"husky","test:v2":"jest __tests__/v2/","build:ts":"npm run clean:lib && tsc","check:ts":"tsc --noEmit","lint:fix":"eslint . --ext .js,.jsx,.ts,.tsx --fix","build:web":"npm run clean:public && webpack --mode production","clean:lib":"node -e \"const fs=require('fs');if(fs.existsSync('lib'))fs.rmSync('lib',{recursive:true,force:true});\"","test:watch":"jest --watch","clean:public":"node -e \"const fs=require('fs');if(fs.existsSync('public'))fs.rmSync('public',{recursive:true,force:true});\"","format:check":"prettier --check \"**/*.{js,jsx,ts,tsx,json,md}\"","test:coverage":"jest --coverage --runInBand","migrate:config":"node lib/scripts/migrate-config.js","check:ts:webapp":"tsc -p tsconfig.webapp.json --noEmit","verify:ci-local":"npm run check:ts && npm run lint && npm run test:coverage && npm run check:ts:webapp && npm run build && npm run conformance:generate && git diff --exit-code -- __conformance__/vectors/golden.json && npm run check:release-docs","test:integration":"jest __tests__/integration/","check:release-docs":"node scripts/check-release-truth.js","conformance:generate":"npm run build:ts && node __conformance__/generate-vectors.js"},"signalk":{"appIcon":"./icons/icon-72x72.png","displayName":"Edge Link Configuration"},"_npmUser":{"name":"kgustafs","email":"ke.gustafsson@gmail.com"},"overrides":{"ws":"8.21.0","js-yaml":"4.3.0"},"repository":{"url":"git+https://github.com/KEGustafsson/signalk-edge-link.git","type":"git"},"_npmVersion":"11.6.1","description":"SignalK Edge Link. Secure UDP link for data exchange.","directories":{},"lint-staged":{"*.{js,jsx}":["prettier --write","eslint --fix"],"*.{ts,tsx}":["prettier --write","eslint --fix"],"*.{json,md}":["prettier --write"]},"_nodeVersion":"24.10.0","dependencies":{"ping-monitor":"^0.8.2","@msgpack/msgpack":"^3.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","react":"^19.0.0","eslint":"^8.57.1","ts-jest":"^29.4.6","webpack":"^5.102.1","prettier":"^3.6.2","react-dom":"^19.0.0","ts-loader":"^9.5.4","@rjsf/core":"^5.18.4","css-loader":"^6.8.1","typescript":"^5.9.3","@babel/core":"^7.29.7","@rjsf/utils":"^5.18.4","@types/node":"^25.3.5","lint-staged":"^15.4.3","webpack-cli":"^5.1.4","@types/react":"^19.0.0","babel-loader":"^9.1.2","style-loader":"^3.3.3","@types/react-dom":"^19.0.0","@babel/preset-env":"^7.22.0","@babel/preset-react":"^7.22.0","copy-webpack-plugin":"^14.0.0","eslint-plugin-react":"^7.37.5","html-webpack-plugin":"^5.5.3","react-test-renderer":"^19.0.0","@rjsf/validator-ajv8":"^5.18.4","@testing-library/dom":"^10.4.1","@testing-library/react":"^16.0.0","jest-environment-jsdom":"^30.3.0","mini-css-extract-plugin":"^2.7.6","@testing-library/jest-dom":"^6.0.0","@typescript-eslint/parser":"^7.18.0","@typescript-eslint/eslint-plugin":"^7.18.0"},"_npmOperationalInternal":{"tmp":"tmp/signalk-edge-link_4.0.1_1785658412585_0.23524912297224354","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"4.0.2":{"name":"signalk-edge-link","version":"4.0.2","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"author":{"name":"Karl-Erik Gustafsson"},"license":"MIT","_id":"signalk-edge-link@4.0.2","maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"bin":{"edge-link-cli":"lib/bin/edge-link-cli.js"},"dist":{"shasum":"99b8c1550bcb7667dfe8ac4dab5b903e95f5163b","tarball":"https://registry.npmjs.org/signalk-edge-link/-/signalk-edge-link-4.0.2.tgz","fileCount":129,"integrity":"sha512-OXF5BAfFgbDIPlplxE7tbrBMl6IZdM4NqtZCsGF8C11rS4W1mwoTrTY2/5Nrz+nEK+mKPJ0O/TcczsR2A/cf0Q==","signatures":[{"sig":"MEUCIQDqkRwC+icvw+02sTlvfCBgNRNc1QFazEzueJERafJdSgIgQrDpYYiLdUqRdY3OWZSPpC6KkRA9SucsmrOfHKBeveU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1604862},"jest":{"testMatch":["**/__tests__/**/*.js","**/__conformance__/**/*.test.js","**/*.test.js","**/*.spec.js","**/*.test.ts","**/*.test.tsx"],"transform":{"^.+\\.js$":["babel-jest",{"presets":[["@babel/preset-env",{"targets":{"node":"current"}}]]}],"^.+\\.(ts|tsx)$":["ts-jest",{"tsconfig":"tsconfig.jest.json","diagnostics":false,"isolatedModules":true}]},"testEnvironment":"node","moduleNameMapper":{"^(?:\\.\\./)+lib/(.*)$":"<rootDir>/src/$1","^(?:\\.\\./)+lib/types$":"<rootDir>/src/foundation/types/index","^(?:\\.\\./)+lib/crypto$":"<rootDir>/src/codec/crypto","^(?:\\.\\./)+lib/packet$":"<rootDir>/src/codec/packet-codec","^(?:\\.\\./)+lib/bonding$":"<rootDir>/src/transport/bonding","^(?:\\.\\./)+lib/metrics$":"<rootDir>/src/domain/metrics/registry","^(?:\\.\\./)+lib/metadata$":"<rootDir>/src/codec/metadata-codec","^(?:\\.\\./)+lib/pipeline$":"<rootDir>/src/transport/pipeline/v1","^(?:\\.\\./)+lib/sequence$":"<rootDir>/src/transport/reliability/sequence","^(?:\\.\\./)+lib/config-io$":"<rootDir>/src/foundation/config-io","^(?:\\.\\./)+lib/constants$":"<rootDir>/src/foundation/constants","^(?:\\.\\./)+lib/congestion$":"<rootDir>/src/transport/congestion","^(?:\\.\\./)+lib/monitoring$":"<rootDir>/src/domain/monitoring/index","^(?:\\.\\./)+lib/prometheus$":"<rootDir>/src/domain/metrics/prometheus","^(?:\\.\\./)+lib/value-dedup$":"<rootDir>/src/codec/value-dedup","^(?:\\.\\./)+lib/compact-delta$":"<rootDir>/src/codec/compact-delta","^(?:\\.\\./)+lib/config-reload$":"<rootDir>/src/foundation/config-reload","^(?:\\.\\./)+lib/CircularBuffer$":"<rootDir>/src/foundation/circular-buffer","^(?:\\.\\./)+lib/config-watcher$":"<rootDir>/src/app/config/watcher","^(?:\\.\\./)+lib/packet-capture$":"<rootDir>/src/domain/monitoring/packet-capture","^(?:\\.\\./)+lib/pathDictionary$":"<rootDir>/src/codec/path-dictionary","^(?:\\.\\./)+lib/pipeline-utils$":"<rootDir>/src/codec/compression","^(?:\\.\\./)+lib/delta-sanitizer$":"<rootDir>/src/codec/delta-sanitizer","^(?:\\.\\./)+lib/source-dispatch$":"<rootDir>/src/codec/source-dispatch","^(?:\\.\\./)+lib/source-snapshot$":"<rootDir>/src/codec/source-snapshot","^(?:\\.\\./)+lib/values-snapshot$":"<rootDir>/src/codec/values-snapshot","^(?:\\.\\./)+lib/pipeline-factory$":"<rootDir>/src/transport/pipeline/factory","^(?:\\.\\./)+lib/retransmit-queue$":"<rootDir>/src/transport/reliability/retransmit-queue","^(?:\\.\\./)+lib/metrics-publisher$":"<rootDir>/src/transport/metrics/publisher","^(?:\\.\\./)+lib/pipeline-v2-client$":"<rootDir>/src/transport/pipeline/reliable-client","^(?:\\.\\./)+lib/pipeline-v2-server$":"<rootDir>/src/transport/pipeline/reliable-server","^(?:\\.\\./)+lib/source-replication$":"<rootDir>/src/domain/source-registry","^(?:\\.\\./)+lib/transport/udp-socket-manager$":"<rootDir>/src/transport/udp-socket-manager"},"coverageDirectory":"coverage","coverageThreshold":{"global":{"lines":65,"branches":60,"functions":65,"statements":65},"./src/webapp/components/cards/":{"lines":70,"branches":65,"functions":60,"statements":70},"./src/transport/pipeline/v1-helpers.ts":{"lines":65,"branches":60,"functions":40,"statements":65}},"setupFilesAfterEnv":["<rootDir>/jest.setup.ts"],"collectCoverageFrom":["src/**/*.ts","src/**/*.tsx","!src/**/*.d.ts"],"moduleFileExtensions":["ts","tsx","js","json","node"],"testPathIgnorePatterns":["/node_modules/","/public/","/__tests__/benchmarks/","/__tests__/helpers/","/__tests__/network-simulator\\.js$","/__conformance__/(?:generate-vectors|build-vectors)\\.js$"]},"main":"lib/index.js","engines":{"node":">=20.9.0"},"gitHead":"ac4c86d4db12cb5c4a388ddb659345bc9323bd11","scripts":{"cli":"node lib/bin/edge-link-cli.js","dev":"webpack --mode development --watch","lint":"eslint . --ext .js,.jsx,.ts,.tsx --max-warnings 0","test":"jest --runInBand","build":"npm run build:ts && npm run build:web","format":"prettier --write \"**/*.{js,jsx,ts,tsx,json,md}\"","verify":"npm run check:ts && npm run lint && npm test","prepack":"npm run build","prepare":"husky","test:v2":"jest __tests__/v2/","build:ts":"npm run clean:lib && tsc","check:ts":"tsc --noEmit","lint:fix":"eslint . --ext .js,.jsx,.ts,.tsx --fix","build:web":"npm run clean:public && webpack --mode production","clean:lib":"node -e \"const fs=require('fs');if(fs.existsSync('lib'))fs.rmSync('lib',{recursive:true,force:true});\"","test:watch":"jest --watch","clean:public":"node -e \"const fs=require('fs');if(fs.existsSync('public'))fs.rmSync('public',{recursive:true,force:true});\"","format:check":"prettier --check \"**/*.{js,jsx,ts,tsx,json,md}\"","test:coverage":"jest --coverage --runInBand","migrate:config":"node lib/scripts/migrate-config.js","check:ts:webapp":"tsc -p tsconfig.webapp.json --noEmit","verify:ci-local":"npm run check:ts && npm run lint && npm run test:coverage && npm run check:ts:webapp && npm run build && npm run conformance:generate && git diff --exit-code -- __conformance__/vectors/golden.json && npm run check:release-docs","test:integration":"jest __tests__/integration/","check:release-docs":"node scripts/check-release-truth.js","conformance:generate":"npm run build:ts && node __conformance__/generate-vectors.js"},"signalk":{"appIcon":"./icons/icon-72x72.png","displayName":"Edge Link Configuration","screenshots":["https://raw.githubusercontent.com/KEGustafsson/signalk-edge-link/main/docs/assets/edge-plugin-config.jpg"]},"_npmUser":{"name":"kgustafs","email":"ke.gustafsson@gmail.com"},"overrides":{"ws":"8.21.0","js-yaml":"4.3.0"},"repository":{"url":"git+https://github.com/KEGustafsson/signalk-edge-link.git","type":"git"},"_npmVersion":"11.6.1","description":"SignalK Edge Link. Secure UDP link for data exchange.","directories":{},"lint-staged":{"*.{js,jsx}":["prettier --write","eslint --fix"],"*.{ts,tsx}":["prettier --write","eslint --fix"],"*.{json,md}":["prettier --write"]},"_nodeVersion":"24.10.0","dependencies":{"ping-monitor":"^0.8.2","@msgpack/msgpack":"^3.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","react":"^19.0.0","eslint":"^8.57.1","ts-jest":"^29.4.6","webpack":"^5.102.1","prettier":"^3.6.2","react-dom":"^19.0.0","ts-loader":"^9.5.4","@rjsf/core":"^5.18.4","css-loader":"^6.8.1","typescript":"^5.9.3","@babel/core":"^7.29.7","@rjsf/utils":"^5.18.4","@types/node":"^25.3.5","lint-staged":"^15.4.3","webpack-cli":"^5.1.4","@types/react":"^19.0.0","babel-loader":"^9.1.2","style-loader":"^3.3.3","@types/react-dom":"^19.0.0","@babel/preset-env":"^7.22.0","@babel/preset-react":"^7.22.0","copy-webpack-plugin":"^14.0.0","eslint-plugin-react":"^7.37.5","html-webpack-plugin":"^5.5.3","react-test-renderer":"^19.0.0","@rjsf/validator-ajv8":"^5.18.4","@testing-library/dom":"^10.4.1","@testing-library/react":"^16.0.0","jest-environment-jsdom":"^30.3.0","mini-css-extract-plugin":"^2.7.6","@testing-library/jest-dom":"^6.0.0","@typescript-eslint/parser":"^7.18.0","@typescript-eslint/eslint-plugin":"^7.18.0"},"_npmOperationalInternal":{"tmp":"tmp/signalk-edge-link_4.0.2_1785662305778_0.28988363159395836","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"4.0.3":{"name":"signalk-edge-link","version":"4.0.3","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"author":{"name":"Karl-Erik Gustafsson"},"license":"MIT","_id":"signalk-edge-link@4.0.3","maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"bin":{"edge-link-cli":"lib/bin/edge-link-cli.js"},"dist":{"shasum":"50c920c9722ea8e3614362567980cdda4dc85dd8","tarball":"https://registry.npmjs.org/signalk-edge-link/-/signalk-edge-link-4.0.3.tgz","fileCount":130,"integrity":"sha512-4aE5iYfARHkA+wodzQP/fMTkXYGunW3dAv1l7KKcWzHbPLO3ppOGi7N1OubCLVsv3kK17Q9f+bkNpTfdsvBwEA==","signatures":[{"sig":"MEYCIQDcweuSoCUnCbE4awKNzbK1uqLiiNN7p9gr+15B9RfR+wIhANrKHysD5Cw2GcSKXtM/mT89jAf1YU5MDRZFdPc3+VK4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1733222},"jest":{"testMatch":["**/__tests__/**/*.js","**/__conformance__/**/*.test.js","**/*.test.js","**/*.spec.js","**/*.test.ts","**/*.test.tsx"],"transform":{"^.+\\.js$":["babel-jest",{"presets":[["@babel/preset-env",{"targets":{"node":"current"}}]]}],"^.+\\.(ts|tsx)$":["ts-jest",{"tsconfig":"tsconfig.jest.json","diagnostics":false,"isolatedModules":true}]},"testEnvironment":"node","moduleNameMapper":{"^(?:\\.\\./)+lib/(.*)$":"<rootDir>/src/$1","^(?:\\.\\./)+lib/types$":"<rootDir>/src/foundation/types/index","^(?:\\.\\./)+lib/crypto$":"<rootDir>/src/codec/crypto","^(?:\\.\\./)+lib/packet$":"<rootDir>/src/codec/packet-codec","^(?:\\.\\./)+lib/bonding$":"<rootDir>/src/transport/bonding","^(?:\\.\\./)+lib/metrics$":"<rootDir>/src/domain/metrics/registry","^(?:\\.\\./)+lib/metadata$":"<rootDir>/src/codec/metadata-codec","^(?:\\.\\./)+lib/pipeline$":"<rootDir>/src/transport/pipeline/v1","^(?:\\.\\./)+lib/sequence$":"<rootDir>/src/transport/reliability/sequence","^(?:\\.\\./)+lib/config-io$":"<rootDir>/src/foundation/config-io","^(?:\\.\\./)+lib/constants$":"<rootDir>/src/foundation/constants","^(?:\\.\\./)+lib/congestion$":"<rootDir>/src/transport/congestion","^(?:\\.\\./)+lib/monitoring$":"<rootDir>/src/domain/monitoring/index","^(?:\\.\\./)+lib/prometheus$":"<rootDir>/src/domain/metrics/prometheus","^(?:\\.\\./)+lib/value-dedup$":"<rootDir>/src/codec/value-dedup","^(?:\\.\\./)+lib/compact-delta$":"<rootDir>/src/codec/compact-delta","^(?:\\.\\./)+lib/config-reload$":"<rootDir>/src/foundation/config-reload","^(?:\\.\\./)+lib/CircularBuffer$":"<rootDir>/src/foundation/circular-buffer","^(?:\\.\\./)+lib/config-watcher$":"<rootDir>/src/app/config/watcher","^(?:\\.\\./)+lib/packet-capture$":"<rootDir>/src/domain/monitoring/packet-capture","^(?:\\.\\./)+lib/pathDictionary$":"<rootDir>/src/codec/path-dictionary","^(?:\\.\\./)+lib/pipeline-utils$":"<rootDir>/src/codec/compression","^(?:\\.\\./)+lib/delta-sanitizer$":"<rootDir>/src/codec/delta-sanitizer","^(?:\\.\\./)+lib/source-dispatch$":"<rootDir>/src/codec/source-dispatch","^(?:\\.\\./)+lib/source-snapshot$":"<rootDir>/src/codec/source-snapshot","^(?:\\.\\./)+lib/values-snapshot$":"<rootDir>/src/codec/values-snapshot","^(?:\\.\\./)+lib/pipeline-factory$":"<rootDir>/src/transport/pipeline/factory","^(?:\\.\\./)+lib/retransmit-queue$":"<rootDir>/src/transport/reliability/retransmit-queue","^(?:\\.\\./)+lib/metrics-publisher$":"<rootDir>/src/transport/metrics/publisher","^(?:\\.\\./)+lib/pipeline-v2-client$":"<rootDir>/src/transport/pipeline/reliable-client","^(?:\\.\\./)+lib/pipeline-v2-server$":"<rootDir>/src/transport/pipeline/reliable-server","^(?:\\.\\./)+lib/source-replication$":"<rootDir>/src/domain/source-registry","^(?:\\.\\./)+lib/transport/udp-socket-manager$":"<rootDir>/src/transport/udp-socket-manager"},"coverageDirectory":"coverage","coverageThreshold":{"global":{"lines":65,"branches":60,"functions":65,"statements":65},"./src/webapp/components/cards/":{"lines":70,"branches":65,"functions":60,"statements":70},"./src/transport/pipeline/v1-helpers.ts":{"lines":65,"branches":60,"functions":40,"statements":65}},"setupFilesAfterEnv":["<rootDir>/jest.setup.ts"],"collectCoverageFrom":["src/**/*.ts","src/**/*.tsx","!src/**/*.d.ts"],"moduleFileExtensions":["ts","tsx","js","json","node"],"testPathIgnorePatterns":["/node_modules/","/public/","/__tests__/benchmarks/","/__tests__/helpers/","/__tests__/network-simulator\\.js$","/__conformance__/(?:generate-vectors|build-vectors)\\.js$"]},"main":"lib/index.js","engines":{"node":">=20.9.0"},"gitHead":"09d6a9e044061fdc8a9e8052dd9ffcc090dd9fe7","scripts":{"cli":"node lib/bin/edge-link-cli.js","dev":"webpack --mode development --watch","lint":"eslint . --ext .js,.jsx,.ts,.tsx --max-warnings 0","test":"jest --runInBand","build":"npm run build:ts && npm run build:web","format":"prettier --write \"**/*.{js,jsx,ts,tsx,json,md}\"","verify":"npm run check:ts && npm run lint && npm test","prepack":"npm run build","prepare":"husky","test:v2":"jest __tests__/v2/","build:ts":"npm run clean:lib && tsc","check:ts":"tsc --noEmit","lint:fix":"eslint . --ext .js,.jsx,.ts,.tsx --fix","build:web":"npm run clean:public && webpack --mode production","clean:lib":"node -e \"const fs=require('fs');if(fs.existsSync('lib'))fs.rmSync('lib',{recursive:true,force:true});\"","test:watch":"jest --watch","clean:public":"node -e \"const fs=require('fs');if(fs.existsSync('public'))fs.rmSync('public',{recursive:true,force:true});\"","format:check":"prettier --check \"**/*.{js,jsx,ts,tsx,json,md}\"","test:coverage":"jest --coverage --runInBand","migrate:config":"node lib/scripts/migrate-config.js","check:ts:webapp":"tsc -p tsconfig.webapp.json --noEmit","verify:ci-local":"npm run check:ts && npm run lint && npm run test:coverage && npm run check:ts:webapp && npm run build && npm run conformance:generate && git diff --exit-code -- __conformance__/vectors/golden.json && npm run check:release-docs","test:integration":"jest __tests__/integration/","check:release-docs":"node scripts/check-release-truth.js","conformance:generate":"npm run build:ts && node __conformance__/generate-vectors.js"},"signalk":{"appIcon":"./public/icons/icon-72x72.png","displayName":"Edge Link Configuration","screenshots":["./docs/assets/edge-plugin-config.jpg"]},"_npmUser":{"name":"kgustafs","email":"ke.gustafsson@gmail.com"},"overrides":{"ws":"8.21.0","js-yaml":"4.3.0"},"repository":{"url":"git+https://github.com/KEGustafsson/signalk-edge-link.git","type":"git"},"_npmVersion":"11.6.1","description":"SignalK Edge Link. Secure UDP link for data exchange.","directories":{},"lint-staged":{"*.{js,jsx}":["prettier --write","eslint --fix"],"*.{ts,tsx}":["prettier --write","eslint --fix"],"*.{json,md}":["prettier --write"]},"_nodeVersion":"24.10.0","dependencies":{"ping-monitor":"^0.8.2","@msgpack/msgpack":"^3.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","react":"^19.0.0","eslint":"^8.57.1","ts-jest":"^29.4.6","webpack":"^5.102.1","prettier":"^3.6.2","react-dom":"^19.0.0","ts-loader":"^9.5.4","@rjsf/core":"^5.18.4","css-loader":"^6.8.1","typescript":"^5.9.3","@babel/core":"^7.29.7","@rjsf/utils":"^5.18.4","@types/node":"^25.3.5","lint-staged":"^15.4.3","webpack-cli":"^5.1.4","@types/react":"^19.0.0","babel-loader":"^9.1.2","style-loader":"^3.3.3","@types/react-dom":"^19.0.0","@babel/preset-env":"^7.22.0","@babel/preset-react":"^7.22.0","copy-webpack-plugin":"^14.0.0","eslint-plugin-react":"^7.37.5","html-webpack-plugin":"^5.5.3","react-test-renderer":"^19.0.0","@rjsf/validator-ajv8":"^5.18.4","@testing-library/dom":"^10.4.1","@testing-library/react":"^16.0.0","jest-environment-jsdom":"^30.3.0","mini-css-extract-plugin":"^2.7.6","@testing-library/jest-dom":"^6.0.0","@typescript-eslint/parser":"^7.18.0","@typescript-eslint/eslint-plugin":"^7.18.0"},"_npmOperationalInternal":{"tmp":"tmp/signalk-edge-link_4.0.3_1785664121152_0.5676750109561046","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"4.0.4":{"name":"signalk-edge-link","version":"4.0.4","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"author":{"name":"Karl-Erik Gustafsson"},"license":"MIT","_id":"signalk-edge-link@4.0.4","maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"bin":{"edge-link-cli":"lib/bin/edge-link-cli.js"},"dist":{"shasum":"16299500d9fb8b29a041628d1c04a72cef566a37","tarball":"https://registry.npmjs.org/signalk-edge-link/-/signalk-edge-link-4.0.4.tgz","fileCount":130,"integrity":"sha512-An02x4qrDz8/rbrV0iPhT3Wro6Y76MdqImqWZhhCat9HCOqk5ZBet55wpWf5+s+bQvo5o1yc1jRDvV/wkbFhUQ==","signatures":[{"sig":"MEUCIQDvZB6ZDByr0/+/5sRtUhLNDyEeESZGO8UB3b4uGufLOQIgOlM3Zz6xFXooGWLNbFGuk7+p03r+u3mc5iGMlahkUIY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1733214},"jest":{"testMatch":["**/__tests__/**/*.js","**/__conformance__/**/*.test.js","**/*.test.js","**/*.spec.js","**/*.test.ts","**/*.test.tsx"],"transform":{"^.+\\.js$":["babel-jest",{"presets":[["@babel/preset-env",{"targets":{"node":"current"}}]]}],"^.+\\.(ts|tsx)$":["ts-jest",{"tsconfig":"tsconfig.jest.json","diagnostics":false,"isolatedModules":true}]},"testEnvironment":"node","moduleNameMapper":{"^(?:\\.\\./)+lib/(.*)$":"<rootDir>/src/$1","^(?:\\.\\./)+lib/types$":"<rootDir>/src/foundation/types/index","^(?:\\.\\./)+lib/crypto$":"<rootDir>/src/codec/crypto","^(?:\\.\\./)+lib/packet$":"<rootDir>/src/codec/packet-codec","^(?:\\.\\./)+lib/bonding$":"<rootDir>/src/transport/bonding","^(?:\\.\\./)+lib/metrics$":"<rootDir>/src/domain/metrics/registry","^(?:\\.\\./)+lib/metadata$":"<rootDir>/src/codec/metadata-codec","^(?:\\.\\./)+lib/pipeline$":"<rootDir>/src/transport/pipeline/v1","^(?:\\.\\./)+lib/sequence$":"<rootDir>/src/transport/reliability/sequence","^(?:\\.\\./)+lib/config-io$":"<rootDir>/src/foundation/config-io","^(?:\\.\\./)+lib/constants$":"<rootDir>/src/foundation/constants","^(?:\\.\\./)+lib/congestion$":"<rootDir>/src/transport/congestion","^(?:\\.\\./)+lib/monitoring$":"<rootDir>/src/domain/monitoring/index","^(?:\\.\\./)+lib/prometheus$":"<rootDir>/src/domain/metrics/prometheus","^(?:\\.\\./)+lib/value-dedup$":"<rootDir>/src/codec/value-dedup","^(?:\\.\\./)+lib/compact-delta$":"<rootDir>/src/codec/compact-delta","^(?:\\.\\./)+lib/config-reload$":"<rootDir>/src/foundation/config-reload","^(?:\\.\\./)+lib/CircularBuffer$":"<rootDir>/src/foundation/circular-buffer","^(?:\\.\\./)+lib/config-watcher$":"<rootDir>/src/app/config/watcher","^(?:\\.\\./)+lib/packet-capture$":"<rootDir>/src/domain/monitoring/packet-capture","^(?:\\.\\./)+lib/pathDictionary$":"<rootDir>/src/codec/path-dictionary","^(?:\\.\\./)+lib/pipeline-utils$":"<rootDir>/src/codec/compression","^(?:\\.\\./)+lib/delta-sanitizer$":"<rootDir>/src/codec/delta-sanitizer","^(?:\\.\\./)+lib/source-dispatch$":"<rootDir>/src/codec/source-dispatch","^(?:\\.\\./)+lib/source-snapshot$":"<rootDir>/src/codec/source-snapshot","^(?:\\.\\./)+lib/values-snapshot$":"<rootDir>/src/codec/values-snapshot","^(?:\\.\\./)+lib/pipeline-factory$":"<rootDir>/src/transport/pipeline/factory","^(?:\\.\\./)+lib/retransmit-queue$":"<rootDir>/src/transport/reliability/retransmit-queue","^(?:\\.\\./)+lib/metrics-publisher$":"<rootDir>/src/transport/metrics/publisher","^(?:\\.\\./)+lib/pipeline-v2-client$":"<rootDir>/src/transport/pipeline/reliable-client","^(?:\\.\\./)+lib/pipeline-v2-server$":"<rootDir>/src/transport/pipeline/reliable-server","^(?:\\.\\./)+lib/source-replication$":"<rootDir>/src/domain/source-registry","^(?:\\.\\./)+lib/transport/udp-socket-manager$":"<rootDir>/src/transport/udp-socket-manager"},"coverageDirectory":"coverage","coverageThreshold":{"global":{"lines":65,"branches":60,"functions":65,"statements":65},"./src/webapp/components/cards/":{"lines":70,"branches":65,"functions":60,"statements":70},"./src/transport/pipeline/v1-helpers.ts":{"lines":65,"branches":60,"functions":40,"statements":65}},"setupFilesAfterEnv":["<rootDir>/jest.setup.ts"],"collectCoverageFrom":["src/**/*.ts","src/**/*.tsx","!src/**/*.d.ts"],"moduleFileExtensions":["ts","tsx","js","json","node"],"testPathIgnorePatterns":["/node_modules/","/public/","/__tests__/benchmarks/","/__tests__/helpers/","/__tests__/network-simulator\\.js$","/__conformance__/(?:generate-vectors|build-vectors)\\.js$"]},"main":"lib/index.js","engines":{"node":">=20.9.0"},"gitHead":"c03583975270e2ed12d95b184ed30ffc3120326d","scripts":{"cli":"node lib/bin/edge-link-cli.js","dev":"webpack --mode development --watch","lint":"eslint . --ext .js,.jsx,.ts,.tsx --max-warnings 0","test":"jest --runInBand","build":"npm run build:ts && npm run build:web","format":"prettier --write \"**/*.{js,jsx,ts,tsx,json,md}\"","verify":"npm run check:ts && npm run lint && npm test","prepack":"npm run build","prepare":"husky","test:v2":"jest __tests__/v2/","build:ts":"npm run clean:lib && tsc","check:ts":"tsc --noEmit","lint:fix":"eslint . --ext .js,.jsx,.ts,.tsx --fix","build:web":"npm run clean:public && webpack --mode production","clean:lib":"node -e \"const fs=require('fs');if(fs.existsSync('lib'))fs.rmSync('lib',{recursive:true,force:true});\"","test:watch":"jest --watch","clean:public":"node -e \"const fs=require('fs');if(fs.existsSync('public'))fs.rmSync('public',{recursive:true,force:true});\"","format:check":"prettier --check \"**/*.{js,jsx,ts,tsx,json,md}\"","test:coverage":"jest --coverage --runInBand","migrate:config":"node lib/scripts/migrate-config.js","check:ts:webapp":"tsc -p tsconfig.webapp.json --noEmit","verify:ci-local":"npm run check:ts && npm run lint && npm run test:coverage && npm run check:ts:webapp && npm run build && npm run conformance:generate && git diff --exit-code -- __conformance__/vectors/golden.json && npm run check:release-docs","test:integration":"jest __tests__/integration/","check:release-docs":"node scripts/check-release-truth.js","conformance:generate":"npm run build:ts && node __conformance__/generate-vectors.js"},"signalk":{"appIcon":".icons/icon-72x72.png","displayName":"Edge Link Configuration","screenshots":["./docs/assets/edge-plugin-config.jpg"]},"_npmUser":{"name":"kgustafs","email":"ke.gustafsson@gmail.com"},"overrides":{"ws":"8.21.0","js-yaml":"4.3.0"},"repository":{"url":"git+https://github.com/KEGustafsson/signalk-edge-link.git","type":"git"},"_npmVersion":"11.6.1","description":"SignalK Edge Link. Secure UDP link for data exchange.","directories":{},"lint-staged":{"*.{js,jsx}":["prettier --write","eslint --fix"],"*.{ts,tsx}":["prettier --write","eslint --fix"],"*.{json,md}":["prettier --write"]},"_nodeVersion":"24.10.0","dependencies":{"ping-monitor":"^0.8.2","@msgpack/msgpack":"^3.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","react":"^19.0.0","eslint":"^8.57.1","ts-jest":"^29.4.6","webpack":"^5.102.1","prettier":"^3.6.2","react-dom":"^19.0.0","ts-loader":"^9.5.4","@rjsf/core":"^5.18.4","css-loader":"^6.8.1","typescript":"^5.9.3","@babel/core":"^7.29.7","@rjsf/utils":"^5.18.4","@types/node":"^25.3.5","lint-staged":"^15.4.3","webpack-cli":"^5.1.4","@types/react":"^19.0.0","babel-loader":"^9.1.2","style-loader":"^3.3.3","@types/react-dom":"^19.0.0","@babel/preset-env":"^7.22.0","@babel/preset-react":"^7.22.0","copy-webpack-plugin":"^14.0.0","eslint-plugin-react":"^7.37.5","html-webpack-plugin":"^5.5.3","react-test-renderer":"^19.0.0","@rjsf/validator-ajv8":"^5.18.4","@testing-library/dom":"^10.4.1","@testing-library/react":"^16.0.0","jest-environment-jsdom":"^30.3.0","mini-css-extract-plugin":"^2.7.6","@testing-library/jest-dom":"^6.0.0","@typescript-eslint/parser":"^7.18.0","@typescript-eslint/eslint-plugin":"^7.18.0"},"_npmOperationalInternal":{"tmp":"tmp/signalk-edge-link_4.0.4_1785666291859_0.4071498489603673","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"4.0.5":{"name":"signalk-edge-link","version":"4.0.5","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"author":{"name":"Karl-Erik Gustafsson"},"license":"MIT","_id":"signalk-edge-link@4.0.5","maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"bin":{"edge-link-cli":"lib/bin/edge-link-cli.js"},"dist":{"shasum":"e28e2b66d6bb42571df8d051f74d6e3b7c6fbd07","tarball":"https://registry.npmjs.org/signalk-edge-link/-/signalk-edge-link-4.0.5.tgz","fileCount":130,"integrity":"sha512-mr5wv3H1QDD4Xp6pvl1MDoXztKvz/fERdyUPJI7PhSlPGgDooLevE1WaNc0/j+VJpepg9LtPhsdW2whWB3Xhgg==","signatures":[{"sig":"MEYCIQD/ne59G4m7KL8Mk8f3n74cYQzoKtPEktyGABnAXrVnYwIhALM5G55U39TJDwfAdv8FxrlzjorrsQy+EmBpGQpMBEP2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1733215},"jest":{"testMatch":["**/__tests__/**/*.js","**/__conformance__/**/*.test.js","**/*.test.js","**/*.spec.js","**/*.test.ts","**/*.test.tsx"],"transform":{"^.+\\.js$":["babel-jest",{"presets":[["@babel/preset-env",{"targets":{"node":"current"}}]]}],"^.+\\.(ts|tsx)$":["ts-jest",{"tsconfig":"tsconfig.jest.json","diagnostics":false,"isolatedModules":true}]},"testEnvironment":"node","moduleNameMapper":{"^(?:\\.\\./)+lib/(.*)$":"<rootDir>/src/$1","^(?:\\.\\./)+lib/types$":"<rootDir>/src/foundation/types/index","^(?:\\.\\./)+lib/crypto$":"<rootDir>/src/codec/crypto","^(?:\\.\\./)+lib/packet$":"<rootDir>/src/codec/packet-codec","^(?:\\.\\./)+lib/bonding$":"<rootDir>/src/transport/bonding","^(?:\\.\\./)+lib/metrics$":"<rootDir>/src/domain/metrics/registry","^(?:\\.\\./)+lib/metadata$":"<rootDir>/src/codec/metadata-codec","^(?:\\.\\./)+lib/pipeline$":"<rootDir>/src/transport/pipeline/v1","^(?:\\.\\./)+lib/sequence$":"<rootDir>/src/transport/reliability/sequence","^(?:\\.\\./)+lib/config-io$":"<rootDir>/src/foundation/config-io","^(?:\\.\\./)+lib/constants$":"<rootDir>/src/foundation/constants","^(?:\\.\\./)+lib/congestion$":"<rootDir>/src/transport/congestion","^(?:\\.\\./)+lib/monitoring$":"<rootDir>/src/domain/monitoring/index","^(?:\\.\\./)+lib/prometheus$":"<rootDir>/src/domain/metrics/prometheus","^(?:\\.\\./)+lib/value-dedup$":"<rootDir>/src/codec/value-dedup","^(?:\\.\\./)+lib/compact-delta$":"<rootDir>/src/codec/compact-delta","^(?:\\.\\./)+lib/config-reload$":"<rootDir>/src/foundation/config-reload","^(?:\\.\\./)+lib/CircularBuffer$":"<rootDir>/src/foundation/circular-buffer","^(?:\\.\\./)+lib/config-watcher$":"<rootDir>/src/app/config/watcher","^(?:\\.\\./)+lib/packet-capture$":"<rootDir>/src/domain/monitoring/packet-capture","^(?:\\.\\./)+lib/pathDictionary$":"<rootDir>/src/codec/path-dictionary","^(?:\\.\\./)+lib/pipeline-utils$":"<rootDir>/src/codec/compression","^(?:\\.\\./)+lib/delta-sanitizer$":"<rootDir>/src/codec/delta-sanitizer","^(?:\\.\\./)+lib/source-dispatch$":"<rootDir>/src/codec/source-dispatch","^(?:\\.\\./)+lib/source-snapshot$":"<rootDir>/src/codec/source-snapshot","^(?:\\.\\./)+lib/values-snapshot$":"<rootDir>/src/codec/values-snapshot","^(?:\\.\\./)+lib/pipeline-factory$":"<rootDir>/src/transport/pipeline/factory","^(?:\\.\\./)+lib/retransmit-queue$":"<rootDir>/src/transport/reliability/retransmit-queue","^(?:\\.\\./)+lib/metrics-publisher$":"<rootDir>/src/transport/metrics/publisher","^(?:\\.\\./)+lib/pipeline-v2-client$":"<rootDir>/src/transport/pipeline/reliable-client","^(?:\\.\\./)+lib/pipeline-v2-server$":"<rootDir>/src/transport/pipeline/reliable-server","^(?:\\.\\./)+lib/source-replication$":"<rootDir>/src/domain/source-registry","^(?:\\.\\./)+lib/transport/udp-socket-manager$":"<rootDir>/src/transport/udp-socket-manager"},"coverageDirectory":"coverage","coverageThreshold":{"global":{"lines":65,"branches":60,"functions":65,"statements":65},"./src/webapp/components/cards/":{"lines":70,"branches":65,"functions":60,"statements":70},"./src/transport/pipeline/v1-helpers.ts":{"lines":65,"branches":60,"functions":40,"statements":65}},"setupFilesAfterEnv":["<rootDir>/jest.setup.ts"],"collectCoverageFrom":["src/**/*.ts","src/**/*.tsx","!src/**/*.d.ts"],"moduleFileExtensions":["ts","tsx","js","json","node"],"testPathIgnorePatterns":["/node_modules/","/public/","/__tests__/benchmarks/","/__tests__/helpers/","/__tests__/network-simulator\\.js$","/__conformance__/(?:generate-vectors|build-vectors)\\.js$"]},"main":"lib/index.js","engines":{"node":">=20.9.0"},"gitHead":"f59f174d7aa9e454c93c9722bee4494297d122b7","scripts":{"cli":"node lib/bin/edge-link-cli.js","dev":"webpack --mode development --watch","lint":"eslint . --ext .js,.jsx,.ts,.tsx --max-warnings 0","test":"jest --runInBand","build":"npm run build:ts && npm run build:web","format":"prettier --write \"**/*.{js,jsx,ts,tsx,json,md}\"","verify":"npm run check:ts && npm run lint && npm test","prepack":"npm run build","prepare":"husky","test:v2":"jest __tests__/v2/","build:ts":"npm run clean:lib && tsc","check:ts":"tsc --noEmit","lint:fix":"eslint . --ext .js,.jsx,.ts,.tsx --fix","build:web":"npm run clean:public && webpack --mode production","clean:lib":"node -e \"const fs=require('fs');if(fs.existsSync('lib'))fs.rmSync('lib',{recursive:true,force:true});\"","test:watch":"jest --watch","clean:public":"node -e \"const fs=require('fs');if(fs.existsSync('public'))fs.rmSync('public',{recursive:true,force:true});\"","format:check":"prettier --check \"**/*.{js,jsx,ts,tsx,json,md}\"","test:coverage":"jest --coverage --runInBand","migrate:config":"node lib/scripts/migrate-config.js","check:ts:webapp":"tsc -p tsconfig.webapp.json --noEmit","verify:ci-local":"npm run check:ts && npm run lint && npm run test:coverage && npm run check:ts:webapp && npm run build && npm run conformance:generate && git diff --exit-code -- __conformance__/vectors/golden.json && npm run check:release-docs","test:integration":"jest __tests__/integration/","check:release-docs":"node scripts/check-release-truth.js","conformance:generate":"npm run build:ts && node __conformance__/generate-vectors.js"},"signalk":{"appIcon":"./icons/icon-72x72.png","displayName":"Edge Link Configuration","screenshots":["./docs/assets/edge-plugin-config.jpg"]},"_npmUser":{"name":"kgustafs","email":"ke.gustafsson@gmail.com"},"overrides":{"ws":"8.21.0","js-yaml":"4.3.0"},"repository":{"url":"git+https://github.com/KEGustafsson/signalk-edge-link.git","type":"git"},"_npmVersion":"11.6.1","description":"SignalK Edge Link. Secure UDP link for data exchange.","directories":{},"lint-staged":{"*.{js,jsx}":["prettier --write","eslint --fix"],"*.{ts,tsx}":["prettier --write","eslint --fix"],"*.{json,md}":["prettier --write"]},"_nodeVersion":"24.10.0","dependencies":{"ping-monitor":"^0.8.2","@msgpack/msgpack":"^3.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","react":"^19.0.0","eslint":"^8.57.1","ts-jest":"^29.4.6","webpack":"^5.102.1","prettier":"^3.6.2","react-dom":"^19.0.0","ts-loader":"^9.5.4","@rjsf/core":"^5.18.4","css-loader":"^6.8.1","typescript":"^5.9.3","@babel/core":"^7.29.7","@rjsf/utils":"^5.18.4","@types/node":"^25.3.5","lint-staged":"^15.4.3","webpack-cli":"^5.1.4","@types/react":"^19.0.0","babel-loader":"^9.1.2","style-loader":"^3.3.3","@types/react-dom":"^19.0.0","@babel/preset-env":"^7.22.0","@babel/preset-react":"^7.22.0","copy-webpack-plugin":"^14.0.0","eslint-plugin-react":"^7.37.5","html-webpack-plugin":"^5.5.3","react-test-renderer":"^19.0.0","@rjsf/validator-ajv8":"^5.18.4","@testing-library/dom":"^10.4.1","@testing-library/react":"^16.0.0","jest-environment-jsdom":"^30.3.0","mini-css-extract-plugin":"^2.7.6","@testing-library/jest-dom":"^6.0.0","@typescript-eslint/parser":"^7.18.0","@typescript-eslint/eslint-plugin":"^7.18.0"},"_npmOperationalInternal":{"tmp":"tmp/signalk-edge-link_4.0.5_1785667123448_0.9287868870464353","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"4.1.0":{"name":"signalk-edge-link","version":"4.1.0","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"author":{"name":"Karl-Erik Gustafsson"},"license":"MIT","_id":"signalk-edge-link@4.1.0","maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"bin":{"edge-link-cli":"lib/bin/edge-link-cli.js"},"dist":{"shasum":"6ffe44354ae5735f3b1a723a841ef3230f98026b","tarball":"https://registry.npmjs.org/signalk-edge-link/-/signalk-edge-link-4.1.0.tgz","fileCount":131,"integrity":"sha512-PoE6RqGNc4lVtFeonrbQQhBhEmc2CxeVEY20WWJLcdzI/iDrTDa/pGy6wof1Fr25E3r8WTa3ZcwthDClnUav6g==","signatures":[{"sig":"MEUCIHmrFlO/WramIggWdoVqLvk6m+2Sc3s9HRmnG4sYi+EeAiEA/pcMuMzvMhhpK7MQrqHVhEnucqVRnFa/7R90/X0/Iig=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1780522},"jest":{"testMatch":["**/__tests__/**/*.js","**/__conformance__/**/*.test.js","**/*.test.js","**/*.spec.js","**/*.test.ts","**/*.test.tsx"],"transform":{"^.+\\.js$":["babel-jest",{"presets":[["@babel/preset-env",{"targets":{"node":"current"}}]]}],"^.+\\.(ts|tsx)$":["ts-jest",{"tsconfig":"tsconfig.jest.json","diagnostics":false,"isolatedModules":true}]},"maxWorkers":1,"testEnvironment":"node","moduleNameMapper":{"^(?:\\.\\./)+lib/(.*)$":"<rootDir>/src/$1","^(?:\\.\\./)+lib/types$":"<rootDir>/src/foundation/types/index","^(?:\\.\\./)+lib/crypto$":"<rootDir>/src/codec/crypto","^(?:\\.\\./)+lib/packet$":"<rootDir>/src/codec/packet-codec","^(?:\\.\\./)+lib/bonding$":"<rootDir>/src/transport/bonding","^(?:\\.\\./)+lib/metrics$":"<rootDir>/src/domain/metrics/registry","^(?:\\.\\./)+lib/metadata$":"<rootDir>/src/codec/metadata-codec","^(?:\\.\\./)+lib/pipeline$":"<rootDir>/src/transport/pipeline/v1","^(?:\\.\\./)+lib/sequence$":"<rootDir>/src/transport/reliability/sequence","^(?:\\.\\./)+lib/config-io$":"<rootDir>/src/foundation/config-io","^(?:\\.\\./)+lib/constants$":"<rootDir>/src/foundation/constants","^(?:\\.\\./)+lib/congestion$":"<rootDir>/src/transport/congestion","^(?:\\.\\./)+lib/monitoring$":"<rootDir>/src/domain/monitoring/index","^(?:\\.\\./)+lib/prometheus$":"<rootDir>/src/domain/metrics/prometheus","^(?:\\.\\./)+lib/value-dedup$":"<rootDir>/src/codec/value-dedup","^(?:\\.\\./)+lib/compact-delta$":"<rootDir>/src/codec/compact-delta","^(?:\\.\\./)+lib/config-reload$":"<rootDir>/src/foundation/config-reload","^(?:\\.\\./)+lib/CircularBuffer$":"<rootDir>/src/foundation/circular-buffer","^(?:\\.\\./)+lib/config-watcher$":"<rootDir>/src/app/config/watcher","^(?:\\.\\./)+lib/packet-capture$":"<rootDir>/src/domain/monitoring/packet-capture","^(?:\\.\\./)+lib/pathDictionary$":"<rootDir>/src/codec/path-dictionary","^(?:\\.\\./)+lib/pipeline-utils$":"<rootDir>/src/codec/compression","^(?:\\.\\./)+lib/delta-sanitizer$":"<rootDir>/src/codec/delta-sanitizer","^(?:\\.\\./)+lib/source-dispatch$":"<rootDir>/src/codec/source-dispatch","^(?:\\.\\./)+lib/source-snapshot$":"<rootDir>/src/codec/source-snapshot","^(?:\\.\\./)+lib/values-snapshot$":"<rootDir>/src/codec/values-snapshot","^(?:\\.\\./)+lib/pipeline-factory$":"<rootDir>/src/transport/pipeline/factory","^(?:\\.\\./)+lib/retransmit-queue$":"<rootDir>/src/transport/reliability/retransmit-queue","^(?:\\.\\./)+lib/metrics-publisher$":"<rootDir>/src/transport/metrics/publisher","^(?:\\.\\./)+lib/pipeline-v2-client$":"<rootDir>/src/transport/pipeline/reliable-client","^(?:\\.\\./)+lib/pipeline-v2-server$":"<rootDir>/src/transport/pipeline/reliable-server","^(?:\\.\\./)+lib/source-replication$":"<rootDir>/src/domain/source-registry","^(?:\\.\\./)+lib/transport/udp-socket-manager$":"<rootDir>/src/transport/udp-socket-manager"},"coverageDirectory":"coverage","coverageThreshold":{"global":{"lines":83,"branches":72,"functions":82,"statements":82},"./src/webapp/components/cards/":{"lines":70,"branches":65,"functions":60,"statements":70},"./src/transport/pipeline/v1-helpers.ts":{"lines":65,"branches":60,"functions":40,"statements":65}},"setupFilesAfterEnv":["<rootDir>/jest.setup.ts"],"collectCoverageFrom":["src/**/*.ts","src/**/*.tsx","!src/**/*.d.ts"],"moduleFileExtensions":["ts","tsx","js","json","node"],"testPathIgnorePatterns":["/node_modules/","/public/","/__tests__/benchmarks/","/__tests__/helpers/","/__tests__/network-simulator\\.js$","/__conformance__/(?:generate-vectors|build-vectors)\\.js$"]},"main":"lib/index.js","engines":{"node":">=20.9.0"},"gitHead":"19b3480e5238447bac8c489dc7d2ecc1cdc6b587","scripts":{"cli":"node lib/bin/edge-link-cli.js","dev":"webpack --mode development --watch","lint":"eslint . --ext .js,.jsx,.ts,.tsx --max-warnings 0","test":"jest --runInBand","build":"npm run build:ts && npm run build:web","format":"prettier --write \"**/*.{js,jsx,ts,tsx,json,md}\"","verify":"npm run check:ts && npm run lint && npm test","prepack":"npm run build","prepare":"husky","test:v2":"jest __tests__/v2/","build:ts":"npm run clean:lib && tsc","check:ts":"tsc --noEmit","lint:fix":"eslint . --ext .js,.jsx,.ts,.tsx --fix","build:web":"npm run clean:public && webpack --mode production","clean:lib":"node -e \"const fs=require('fs');if(fs.existsSync('lib'))fs.rmSync('lib',{recursive:true,force:true});\"","test:watch":"jest --watch","clean:public":"node -e \"const fs=require('fs');if(fs.existsSync('public'))fs.rmSync('public',{recursive:true,force:true});\"","format:check":"prettier --check \"**/*.{js,jsx,ts,tsx,json,md}\"","test:coverage":"jest --coverage --runInBand","migrate:config":"node lib/scripts/migrate-config.js","check:ts:webapp":"tsc -p tsconfig.webapp.json --noEmit","verify:ci-local":"npm run check:ts && npm run lint && npm run test:coverage && npm run check:ts:webapp && npm run build && npm run conformance:generate && git diff --exit-code -- __conformance__/vectors/golden.json && npm run check:release-docs","test:integration":"jest __tests__/integration/","check:release-docs":"node scripts/check-release-truth.js","conformance:generate":"npm run build:ts && node __conformance__/generate-vectors.js"},"signalk":{"appIcon":"./icons/icon-72x72.png","displayName":"Edge Link Configuration","screenshots":["./docs/assets/edge-plugin-config.jpg"]},"_npmUser":{"name":"kgustafs","email":"ke.gustafsson@gmail.com"},"overrides":{"ws":"8.21.0","js-yaml":"4.3.0","fast-uri":"^3.1.5"},"repository":{"url":"git+https://github.com/KEGustafsson/signalk-edge-link.git","type":"git"},"_npmVersion":"11.6.1","description":"SignalK Edge Link. Secure UDP link for data exchange.","directories":{},"lint-staged":{"*.{js,jsx}":["prettier --write","eslint --fix"],"*.{ts,tsx}":["prettier --write","eslint --fix"],"*.{json,md}":["prettier --write"]},"_nodeVersion":"24.10.0","dependencies":{"ping-monitor":"^0.8.2","@msgpack/msgpack":"^3.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","react":"^19.0.0","eslint":"^8.57.1","ts-jest":"^29.4.6","webpack":"^5.102.1","prettier":"^3.6.2","react-dom":"^19.0.0","ts-loader":"^9.5.4","@rjsf/core":"^5.18.4","css-loader":"^6.8.1","typescript":"^5.9.3","@babel/core":"^7.29.7","@rjsf/utils":"^5.18.4","@types/node":"^25.3.5","lint-staged":"^15.4.3","webpack-cli":"^5.1.4","@types/react":"^19.0.0","babel-loader":"^9.1.2","style-loader":"^3.3.3","@types/react-dom":"^19.0.0","@babel/preset-env":"^7.22.0","@babel/preset-react":"^7.22.0","copy-webpack-plugin":"^14.0.0","eslint-plugin-react":"^7.37.5","html-webpack-plugin":"^5.5.3","react-test-renderer":"^19.0.0","@rjsf/validator-ajv8":"^5.18.4","@testing-library/dom":"^10.4.1","@testing-library/react":"^16.0.0","jest-environment-jsdom":"^30.3.0","mini-css-extract-plugin":"^2.7.6","@testing-library/jest-dom":"^6.0.0","@typescript-eslint/parser":"^7.18.0","@typescript-eslint/eslint-plugin":"^7.18.0"},"_npmOperationalInternal":{"tmp":"tmp/signalk-edge-link_4.1.0_1786354512952_0.6664069833062434","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"4.2.0":{"name":"signalk-edge-link","version":"4.2.0","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"author":{"name":"Karl-Erik Gustafsson"},"license":"MIT","_id":"signalk-edge-link@4.2.0","maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"bin":{"edge-link-cli":"lib/bin/edge-link-cli.js"},"dist":{"shasum":"72c7f13a55eb5b7957a6d80749ec5b26c92d9eca","tarball":"https://registry.npmjs.org/signalk-edge-link/-/signalk-edge-link-4.2.0.tgz","fileCount":135,"integrity":"sha512-+P9tSG8I45qJmoOp0XhG+fmuZpvYoT/g21Pm7wcnLDBdBCqZ3IR1O7pAalXQNrrmtvviYjBM0WIs3tTmSdw64g==","signatures":[{"sig":"MEQCICGSGqmN3fg5PKNm34+W/MUW/Y+z1m6yNkViN++UMRGIAiBmaJfSQdHcT/mo8/Q6hFN9qHpacx59hq5HvRTU63mcfg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1822089},"jest":{"testMatch":["**/__tests__/**/*.js","**/__conformance__/**/*.test.js","**/*.test.js","**/*.spec.js","**/*.test.ts","**/*.test.tsx"],"transform":{"^.+\\.js$":["babel-jest",{"presets":[["@babel/preset-env",{"targets":{"node":"current"}}]]}],"^.+\\.(ts|tsx)$":["ts-jest",{"tsconfig":"tsconfig.jest.json","diagnostics":false,"isolatedModules":true}]},"maxWorkers":1,"testEnvironment":"node","moduleNameMapper":{"^(?:\\.\\./)+lib/(.*)$":"<rootDir>/src/$1","^(?:\\.\\./)+lib/types$":"<rootDir>/src/foundation/types/index","^(?:\\.\\./)+lib/crypto$":"<rootDir>/src/codec/crypto","^(?:\\.\\./)+lib/packet$":"<rootDir>/src/codec/packet-codec","^(?:\\.\\./)+lib/bonding$":"<rootDir>/src/transport/bonding","^(?:\\.\\./)+lib/metrics$":"<rootDir>/src/domain/metrics/registry","^(?:\\.\\./)+lib/metadata$":"<rootDir>/src/codec/metadata-codec","^(?:\\.\\./)+lib/pipeline$":"<rootDir>/src/transport/pipeline/v1","^(?:\\.\\./)+lib/sequence$":"<rootDir>/src/transport/reliability/sequence","^(?:\\.\\./)+lib/config-io$":"<rootDir>/src/foundation/config-io","^(?:\\.\\./)+lib/constants$":"<rootDir>/src/foundation/constants","^(?:\\.\\./)+lib/congestion$":"<rootDir>/src/transport/congestion","^(?:\\.\\./)+lib/monitoring$":"<rootDir>/src/domain/monitoring/index","^(?:\\.\\./)+lib/prometheus$":"<rootDir>/src/domain/metrics/prometheus","^(?:\\.\\./)+lib/value-dedup$":"<rootDir>/src/codec/value-dedup","^(?:\\.\\./)+lib/compact-delta$":"<rootDir>/src/codec/compact-delta","^(?:\\.\\./)+lib/config-reload$":"<rootDir>/src/foundation/config-reload","^(?:\\.\\./)+lib/CircularBuffer$":"<rootDir>/src/foundation/circular-buffer","^(?:\\.\\./)+lib/config-watcher$":"<rootDir>/src/app/config/watcher","^(?:\\.\\./)+lib/packet-capture$":"<rootDir>/src/domain/monitoring/packet-capture","^(?:\\.\\./)+lib/pathDictionary$":"<rootDir>/src/codec/path-dictionary","^(?:\\.\\./)+lib/pipeline-utils$":"<rootDir>/src/codec/compression","^(?:\\.\\./)+lib/delta-sanitizer$":"<rootDir>/src/codec/delta-sanitizer","^(?:\\.\\./)+lib/source-dispatch$":"<rootDir>/src/codec/source-dispatch","^(?:\\.\\./)+lib/source-snapshot$":"<rootDir>/src/codec/source-snapshot","^(?:\\.\\./)+lib/values-snapshot$":"<rootDir>/src/codec/values-snapshot","^(?:\\.\\./)+lib/pipeline-factory$":"<rootDir>/src/transport/pipeline/factory","^(?:\\.\\./)+lib/retransmit-queue$":"<rootDir>/src/transport/reliability/retransmit-queue","^(?:\\.\\./)+lib/metrics-publisher$":"<rootDir>/src/transport/metrics/publisher","^(?:\\.\\./)+lib/pipeline-v2-client$":"<rootDir>/src/transport/pipeline/reliable-client","^(?:\\.\\./)+lib/pipeline-v2-server$":"<rootDir>/src/transport/pipeline/reliable-server","^(?:\\.\\./)+lib/source-replication$":"<rootDir>/src/domain/source-registry","^(?:\\.\\./)+lib/transport/udp-socket-manager$":"<rootDir>/src/transport/udp-socket-manager"},"coverageDirectory":"coverage","coverageThreshold":{"global":{"lines":83,"branches":72,"functions":82,"statements":82},"./src/webapp/components/cards/":{"lines":70,"branches":65,"functions":60,"statements":70},"./src/transport/pipeline/v1-helpers.ts":{"lines":65,"branches":60,"functions":40,"statements":65}},"setupFilesAfterEnv":["<rootDir>/jest.setup.ts"],"collectCoverageFrom":["src/**/*.ts","src/**/*.tsx","!src/**/*.d.ts"],"moduleFileExtensions":["ts","tsx","js","json","node"],"testPathIgnorePatterns":["/node_modules/","/public/","/__tests__/benchmarks/","/__tests__/helpers/","/__tests__/network-simulator\\.js$","/__conformance__/(?:generate-vectors|build-vectors)\\.js$"]},"main":"lib/index.js","engines":{"node":">=20.9.0"},"gitHead":"b632f985cc0770f80ba3992902b7f429043d58e3","scripts":{"cli":"node lib/bin/edge-link-cli.js","dev":"webpack --mode development --watch","lint":"eslint . --ext .js,.jsx,.ts,.tsx --max-warnings 0","test":"jest --runInBand","build":"npm run build:ts && npm run build:web","format":"prettier --write \"**/*.{js,jsx,ts,tsx,json,md}\"","verify":"npm run check:ts && npm run lint && npm test","prepack":"npm run build","prepare":"husky","test:v2":"jest __tests__/v2/","build:ts":"npm run clean:lib && tsc","check:ts":"tsc --noEmit","lint:fix":"eslint . --ext .js,.jsx,.ts,.tsx --fix","build:web":"npm run clean:public && webpack --mode production","clean:lib":"node -e \"const fs=require('fs');if(fs.existsSync('lib'))fs.rmSync('lib',{recursive:true,force:true});\"","test:watch":"jest --watch","clean:public":"node -e \"const fs=require('fs');if(fs.existsSync('public'))fs.rmSync('public',{recursive:true,force:true});\"","format:check":"prettier --check \"**/*.{js,jsx,ts,tsx,json,md}\"","test:coverage":"jest --coverage --runInBand","migrate:config":"node lib/scripts/migrate-config.js","check:ts:webapp":"tsc -p tsconfig.webapp.json --noEmit","verify:ci-local":"npm run check:ts && npm run lint && npm run test:coverage && npm run check:ts:webapp && npm run build && npm run conformance:generate && git diff --exit-code -- __conformance__/vectors/golden.json && npm run check:release-docs","test:integration":"jest __tests__/integration/","check:release-docs":"node scripts/check-release-truth.js","conformance:generate":"npm run build:ts && node __conformance__/generate-vectors.js"},"signalk":{"appIcon":"./icons/icon-72x72.png","displayName":"Edge Link Configuration","screenshots":["./docs/assets/edge-plugin-config.jpg"]},"_npmUser":{"name":"kgustafs","email":"ke.gustafsson@gmail.com"},"overrides":{"ws":"8.21.0","js-yaml":"4.3.0","fast-uri":"^3.1.5"},"repository":{"url":"git+https://github.com/KEGustafsson/signalk-edge-link.git","type":"git"},"_npmVersion":"11.6.1","description":"SignalK Edge Link. Secure UDP link for data exchange.","directories":{},"lint-staged":{"*.{js,jsx}":["prettier --write","eslint --fix"],"*.{ts,tsx}":["prettier --write","eslint --fix"],"*.{json,md}":["prettier --write"]},"_nodeVersion":"24.10.0","dependencies":{"ping-monitor":"^0.8.2","@msgpack/msgpack":"^3.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^9.1.7","react":"^19.0.0","eslint":"^8.57.1","ts-jest":"^29.4.6","webpack":"^5.102.1","prettier":"^3.6.2","react-dom":"^19.0.0","ts-loader":"^9.5.4","@rjsf/core":"^5.18.4","css-loader":"^6.8.1","typescript":"^5.9.3","@babel/core":"^7.29.7","@rjsf/utils":"^5.18.4","@types/node":"^25.3.5","lint-staged":"^15.4.3","webpack-cli":"^5.1.4","@types/react":"^19.0.0","babel-loader":"^9.1.2","style-loader":"^3.3.3","@types/react-dom":"^19.0.0","@babel/preset-env":"^7.22.0","@babel/preset-react":"^7.22.0","copy-webpack-plugin":"^14.0.0","eslint-plugin-react":"^7.37.5","html-webpack-plugin":"^5.5.3","react-test-renderer":"^19.0.0","@rjsf/validator-ajv8":"^5.18.4","@testing-library/dom":"^10.4.1","@testing-library/react":"^16.0.0","jest-environment-jsdom":"^30.3.0","mini-css-extract-plugin":"^2.7.6","@testing-library/jest-dom":"^7.0.0","@typescript-eslint/parser":"^8.66.0","@typescript-eslint/eslint-plugin":"^8.66.0"},"_npmOperationalInternal":{"tmp":"tmp/signalk-edge-link_4.2.0_1788100786383_0.7312355900160432","host":"s3://npm-registry-packages-npm-production"},"signalk-plugin-enabled-by-default":false},"4.3.0":{"name":"signalk-edge-link","version":"4.3.0","description":"SignalK Edge Link. Secure UDP link for data exchange.","main":"lib/index.js","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"signalk":{"appIcon":"./icons/icon-72x72.png","displayName":"Edge Link Configuration","screenshots":["./docs/assets/edge-plugin-config.jpg"]},"signalk-plugin-enabled-by-default":false,"scripts":{"clean:lib":"node -e \"const fs=require('fs');if(fs.existsSync('lib'))fs.rmSync('lib',{recursive:true,force:true});\"","clean:public":"node -e \"const fs=require('fs');if(fs.existsSync('public'))fs.rmSync('public',{recursive:true,force:true});\"","build":"npm run build:ts && npm run build:web","build:web":"npm run clean:public && webpack --mode production","build:ts":"npm run clean:lib && tsc","check:ts":"tsc --noEmit","check:release-docs":"node scripts/check-release-truth.js","verify":"npm run check:ts && npm run lint && npm test","check:ts:webapp":"tsc -p tsconfig.webapp.json --noEmit","verify:ci-local":"npm run check:ts && npm run lint && npm run test:coverage && npm run check:ts:webapp && npm run build && npm run conformance:generate && git diff --exit-code -- __conformance__/vectors/golden.json && npm run check:release-docs","conformance:generate":"npm run build:ts && node __conformance__/generate-vectors.js","dev":"webpack --mode development --watch","test":"jest --runInBand","test:v2":"jest __tests__/v2/","test:integration":"jest __tests__/integration/","test:watch":"jest --watch","test:coverage":"jest --coverage --runInBand","lint":"eslint . --ext .js,.jsx,.ts,.tsx --max-warnings 0","lint:fix":"eslint . --ext .js,.jsx,.ts,.tsx --fix","format":"prettier --write \"**/*.{js,jsx,ts,tsx,json,md}\"","format:check":"prettier --check \"**/*.{js,jsx,ts,tsx,json,md}\"","migrate:config":"node lib/scripts/migrate-config.js","cli":"node lib/bin/edge-link-cli.js","prepack":"npm run build","prepare":"husky"},"dependencies":{"@msgpack/msgpack":"^3.0.0","ping-monitor":"^0.8.2"},"devDependencies":{"@babel/core":"^7.29.7","@babel/preset-env":"^7.22.0","@babel/preset-react":"^7.22.0","@rjsf/core":"^5.18.4","@rjsf/utils":"^5.18.4","@rjsf/validator-ajv8":"^5.18.4","@testing-library/dom":"^10.4.1","@testing-library/jest-dom":"^7.0.0","@testing-library/react":"^16.0.0","@types/node":"^25.3.5","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@typescript-eslint/eslint-plugin":"^8.66.0","@typescript-eslint/parser":"^8.66.0","babel-loader":"^9.1.2","copy-webpack-plugin":"^14.0.0","css-loader":"^6.8.1","eslint":"^8.57.1","eslint-plugin-react":"^7.37.5","html-webpack-plugin":"^5.5.3","husky":"^9.1.7","jest":"^29.7.0","jest-environment-jsdom":"^30.3.0","lint-staged":"^15.4.3","mini-css-extract-plugin":"^2.7.6","prettier":"^3.6.2","react":"^19.0.0","react-dom":"^19.0.0","react-test-renderer":"^19.0.0","style-loader":"^3.3.3","ts-jest":"^29.4.6","ts-loader":"^9.5.4","typescript":"^5.9.3","webpack":"^5.102.1","webpack-cli":"^5.1.4"},"overrides":{"js-yaml":"4.3.0","ws":"8.21.0","fast-uri":"^3.1.7"},"engines":{"node":">=20.9.0"},"author":{"name":"Karl-Erik Gustafsson"},"repository":{"type":"git","url":"git+https://github.com/KEGustafsson/signalk-edge-link.git"},"homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"license":"MIT","jest":{"testEnvironment":"node","maxWorkers":1,"coverageDirectory":"coverage","collectCoverageFrom":["src/**/*.ts","src/**/*.tsx","!src/**/*.d.ts"],"setupFilesAfterEnv":["<rootDir>/jest.setup.ts"],"moduleNameMapper":{"^(?:\\.\\./)+lib/bonding$":"<rootDir>/src/transport/bonding","^(?:\\.\\./)+lib/compact-delta$":"<rootDir>/src/codec/compact-delta","^(?:\\.\\./)+lib/congestion$":"<rootDir>/src/transport/congestion","^(?:\\.\\./)+lib/crypto$":"<rootDir>/src/codec/crypto","^(?:\\.\\./)+lib/delta-sanitizer$":"<rootDir>/src/codec/delta-sanitizer","^(?:\\.\\./)+lib/metadata$":"<rootDir>/src/codec/metadata-codec","^(?:\\.\\./)+lib/metrics-publisher$":"<rootDir>/src/transport/metrics/publisher","^(?:\\.\\./)+lib/metrics$":"<rootDir>/src/domain/metrics/registry","^(?:\\.\\./)+lib/monitoring$":"<rootDir>/src/domain/monitoring/index","^(?:\\.\\./)+lib/packet-capture$":"<rootDir>/src/domain/monitoring/packet-capture","^(?:\\.\\./)+lib/packet$":"<rootDir>/src/codec/packet-codec","^(?:\\.\\./)+lib/pathDictionary$":"<rootDir>/src/codec/path-dictionary","^(?:\\.\\./)+lib/pipeline-factory$":"<rootDir>/src/transport/pipeline/factory","^(?:\\.\\./)+lib/pipeline-utils$":"<rootDir>/src/codec/compression","^(?:\\.\\./)+lib/transport/udp-socket-manager$":"<rootDir>/src/transport/udp-socket-manager","^(?:\\.\\./)+lib/pipeline-v2-client$":"<rootDir>/src/transport/pipeline/reliable-client","^(?:\\.\\./)+lib/pipeline-v2-server$":"<rootDir>/src/transport/pipeline/reliable-server","^(?:\\.\\./)+lib/pipeline$":"<rootDir>/src/transport/pipeline/v1","^(?:\\.\\./)+lib/prometheus$":"<rootDir>/src/domain/metrics/prometheus","^(?:\\.\\./)+lib/retransmit-queue$":"<rootDir>/src/transport/reliability/retransmit-queue","^(?:\\.\\./)+lib/sequence$":"<rootDir>/src/transport/reliability/sequence","^(?:\\.\\./)+lib/source-dispatch$":"<rootDir>/src/codec/source-dispatch","^(?:\\.\\./)+lib/source-replication$":"<rootDir>/src/domain/source-registry","^(?:\\.\\./)+lib/source-snapshot$":"<rootDir>/src/codec/source-snapshot","^(?:\\.\\./)+lib/types$":"<rootDir>/src/foundation/types/index","^(?:\\.\\./)+lib/value-dedup$":"<rootDir>/src/codec/value-dedup","^(?:\\.\\./)+lib/values-snapshot$":"<rootDir>/src/codec/values-snapshot","^(?:\\.\\./)+lib/CircularBuffer$":"<rootDir>/src/foundation/circular-buffer","^(?:\\.\\./)+lib/config-io$":"<rootDir>/src/foundation/config-io","^(?:\\.\\./)+lib/config-reload$":"<rootDir>/src/foundation/config-reload","^(?:\\.\\./)+lib/config-watcher$":"<rootDir>/src/app/config/watcher","^(?:\\.\\./)+lib/constants$":"<rootDir>/src/foundation/constants","^(?:\\.\\./)+lib/(.*)$":"<rootDir>/src/$1"},"testMatch":["**/__tests__/**/*.js","**/__conformance__/**/*.test.js","**/*.test.js","**/*.spec.js","**/*.test.ts","**/*.test.tsx"],"transform":{"^.+\\.js$":["babel-jest",{"presets":[["@babel/preset-env",{"targets":{"node":"current"}}]]}],"^.+\\.(ts|tsx)$":["ts-jest",{"tsconfig":"tsconfig.jest.json","isolatedModules":true,"diagnostics":false}]},"moduleFileExtensions":["ts","tsx","js","json","node"],"testPathIgnorePatterns":["/node_modules/","/public/","/__tests__/benchmarks/","/__tests__/helpers/","/__tests__/network-simulator\\.js$","/__conformance__/(?:generate-vectors|build-vectors)\\.js$"],"coverageThreshold":{"global":{"branches":72,"functions":82,"lines":83,"statements":82},"./src/transport/pipeline/v1-helpers.ts":{"branches":60,"functions":40,"lines":65,"statements":65},"./src/webapp/components/cards/":{"branches":65,"functions":60,"lines":70,"statements":70}}},"bin":{"edge-link-cli":"lib/bin/edge-link-cli.js"},"lint-staged":{"*.{js,jsx}":["prettier --write","eslint --fix"],"*.{ts,tsx}":["prettier --write","eslint --fix"],"*.{json,md}":["prettier --write"]},"gitHead":"b2f8ecb9974ee79c3ae8d90863b6fc13f515c2e7","_id":"signalk-edge-link@4.3.0","_nodeVersion":"24.10.0","_npmVersion":"11.6.1","dist":{"integrity":"sha512-R9lHnIgNfmWJxeAJTn4xD+MNRbgfglyaxyy/4H21rmFFd8F3XJaikBDR29q2vi4B28DhZMEQjHifmD3Bdqp4SQ==","shasum":"1685398938bfee51222473c50d86ac4e07debf54","tarball":"https://registry.npmjs.org/signalk-edge-link/-/signalk-edge-link-4.3.0.tgz","fileCount":135,"unpackedSize":1837690,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDa+dKLfnHcs4+JCxNVztDbZpPdyizKXbIaUxwGakRycwIhAM5r/aktzIOSkSn1PmX7iJcafCe3krcl/80x5Pfq68ld"}]},"_npmUser":{"name":"kgustafs","email":"ke.gustafsson@gmail.com"},"directories":{},"maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/signalk-edge-link_4.3.0_1788465279057_0.7255225815029185"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-07T10:42:49.829Z","modified":"2026-09-03T19:54:39.457Z","1.0.0":"2026-02-07T10:42:50.063Z","1.0.1":"2026-02-16T13:42:51.570Z","2.0.0-beta.1":"2026-02-18T17:46:49.521Z","2.0.0-beta.2":"2026-02-19T14:37:22.616Z","2.0.0-beta.3":"2026-02-19T14:59:05.443Z","2.0.0-beta.4":"2026-02-24T10:59:42.722Z","2.1.0-beta.1":"2026-03-03T13:44:03.950Z","2.1.0-beta.2":"2026-03-03T16:57:44.332Z","2.1.0-beta.3":"2026-03-04T06:10:32.152Z","2.1.0-beta.4":"2026-03-04T16:35:19.608Z","2.1.0-beta.5":"2026-03-08T13:56:58.583Z","2.1.0-beta.6":"2026-03-08T14:23:11.645Z","2.1.0-beta.7":"2026-03-08T20:19:19.042Z","2.1.0-beta.8":"2026-03-10T16:46:24.502Z","2.1.0-beta.9":"2026-03-16T09:05:58.212Z","2.1.0-beta.10":"2026-03-16T12:54:15.966Z","2.1.0-beta.11":"2026-03-16T13:28:24.032Z","2.0.0":"2026-03-17T14:33:56.252Z","2.1.0":"2026-03-22T15:17:42.823Z","2.1.1":"2026-03-23T14:16:27.699Z","2.2.0":"2026-04-19T20:36:42.797Z","2.2.1":"2026-04-19T20:49:42.892Z","2.3.0":"2026-04-25T10:53:56.471Z","2.4.0":"2026-04-25T19:58:43.987Z","2.4.1":"2026-04-28T16:12:34.250Z","2.5.0":"2026-05-04T17:58:18.911Z","2.5.1":"2026-05-10T19:48:00.213Z","2.6.0":"2026-05-11T17:33:59.604Z","2.6.1":"2026-05-11T18:55:14.227Z","2.6.2":"2026-05-12T14:33:14.290Z","2.6.3":"2026-05-12T15:56:42.014Z","2.7.0":"2026-05-20T19:45:13.583Z","2.8.0":"2026-05-21T16:29:56.004Z","2.9.0":"2026-05-29T14:05:31.233Z","2.9.1":"2026-06-06T22:42:09.881Z","3.0.0":"2026-06-27T16:12:00.318Z","3.1.0":"2026-07-02T14:42:21.746Z","4.0.0":"2026-07-31T18:34:10.270Z","4.0.1":"2026-08-02T08:13:32.767Z","4.0.2":"2026-08-02T09:18:26.030Z","4.0.3":"2026-08-02T09:48:41.337Z","4.0.4":"2026-08-02T10:24:52.007Z","4.0.5":"2026-08-02T10:38:43.603Z","4.1.0":"2026-08-10T09:35:13.127Z","4.2.0":"2026-08-30T14:39:46.581Z","4.3.0":"2026-09-03T19:54:39.270Z"},"bugs":{"url":"https://github.com/KEGustafsson/signalk-edge-link/issues"},"author":{"name":"Karl-Erik Gustafsson"},"license":"MIT","homepage":"https://github.com/KEGustafsson/signalk-edge-link#readme","keywords":["signalk-node-server-plugin","signalk-category-network","signalk-webapp","signalk-category-utility","signalk-plugin-configurator"],"repository":{"type":"git","url":"git+https://github.com/KEGustafsson/signalk-edge-link.git"},"description":"SignalK Edge Link. Secure UDP link for data exchange.","maintainers":[{"name":"kgustafs","email":"ke.gustafsson@gmail.com"}],"readme":"# Signal K Edge Link\n\n[![npm version](https://img.shields.io/npm/v/signalk-edge-link)](https://www.npmjs.com/package/signalk-edge-link)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n[![Node.js](https://img.shields.io/badge/node-%3E%3D20-brightgreen)](https://nodejs.org)\n\nSignal K Edge Link is a Signal K plugin that transfers vessel deltas between Signal K servers over encrypted UDP.\n\nIt is designed for links where latency, packet loss, and bandwidth usage matter (cellular, satellite, and other unstable WAN paths).\n\n![Data Connector Concept](docs/assets/dataconnectorconcept.jpg)\n\n## Why use it?\n\n- **Secure transport** using AES-256-GCM\n- **Bandwidth optimization** with Brotli compression (plus optional MessagePack and path dictionary)\n- **Two operating modes**:\n  - **Client**: subscribes to local deltas and sends packets\n  - **Server**: receives packets, decrypts, and forwards to local Signal K\n- **Advanced mode** features for difficult links:\n  - ACK/NAK-based reliability\n  - congestion control\n  - optional primary/backup bonding\n  - monitoring and alerting endpoints\n  - values snapshot replay on subscribe, retry, and socket recovery\n  - optional server-triggered full-state request on restart (`requestFullStatusOnRestart`)\n  - Signal K path metadata transport (units, descriptions, zones)\n- **Multi-connection support** on one Signal K instance\n\n## How data flows\n\n```text\nClient Signal K\n  -> subscribe + batch deltas\n  -> optional path dictionary + MessagePack\n  -> Brotli compress\n  -> AES-256-GCM encrypt\n  -> UDP send\n\nServer Signal K\n  <- UDP receive\n  <- AES-256-GCM decrypt\n  <- Brotli decompress\n  <- optional MessagePack + path decode\n  <- inject into local Signal K\n```\n\n## Topologies\n\n**Point to point** — one client sends to one server.\n\n**Multiple clients to one server** — several vessels report to a single shore\ninstance; each client is an independent connection with its own key.\n\n**Bonding** — one client sends over two links (for example LTE and Starlink)\nwith automatic failover. See [`docs/bonding.md`](docs/bonding.md).\n\n**Relay (proxy) chain** — one Signal K instance runs **both** a server and a\nclient, receiving on one hop and forwarding on the next:\n\n```text\n  [Vessel]  ──UDP v3──►  [ Relay ]  ──UDP v3──►  [Shore]\n                       server + client\n```\n\nEach hop is an independent link: its own secret key, handshake, reliability\nsettings and security options. A relay therefore shows **two connections** in\nthe UI, one per hop, and each dashboard reports only its own link — see\n[Reading a relay (proxy) node](docs/web-ui.md) for how to interpret them, and\n[Relay / Proxy Chains](docs/troubleshooting.md) for hop-by-hop diagnosis.\n\n## Requirements\n\n- Two Signal K instances (source and destination)\n- UDP reachability from client to server on your chosen port\n- Shared encryption key on both ends (32-character ASCII, 64-character hex, or 44-character base64)\n- Node.js 20.9.0+ (if installing from source: dev dependencies including TypeScript are installed automatically via `npm install`)\n\n## Installation\n\n### Option A: Signal K Plugin Manager\n\nInstall **Signal K Edge Link** from your Signal K plugin catalog.\n\n### Option B: Manual install from source\n\n```bash\ncd ~/.signalk/node_modules\ngit clone https://github.com/KEGustafsson/signalk-edge-link.git\ncd signalk-edge-link\nnpm install\nnpm run build\n```\n\nRestart Signal K after installation.\n\n## Quick start\n\n### 1) Configure the destination (Server mode)\n\nIn Signal K Admin UI:\n\n1. Open `Server -> Plugin Config -> Signal K Edge Link`\n2. Click **Add Server**\n3. Set:\n   - `Connection Name` (for example `shore-server`)\n   - `UDP Port` (default `4446`)\n   - `Encryption Key` (same shared secret used by client)\n   - `Protocol` — select **Advanced** (v3, recommended) for new deployments; select **Basic** (v1) only for stable local links\n4. Save\n\n### 2) Configure the source (Client mode)\n\nOn the sending Signal K instance:\n\n1. Open `Server -> Plugin Config -> Signal K Edge Link`\n2. Click **Add Client**\n3. Set:\n   - `Connection Name` (for example `vessel-client`)\n   - `Server Address` (destination host/IP)\n   - `UDP Port` (must match server)\n   - `Encryption Key` (must match server)\n   - `Protocol` — select **Advanced** (v3, recommended) for new deployments; select **Basic** (v1) only for stable local links\n4. Save\n\n### 3) Verify traffic\n\nOpen the runtime UI:\n\n`http://<signalk-host>:3000/plugins/signalk-edge-link/`\n\nCheck that:\n\n- client `Deltas Sent` increases\n- server `Deltas Received` increases\n- encryption/decryption errors remain stable at zero\n\n## Protocol guidance\n\n| Mode         | Numeric | Use when                                 | Notes                                                                    |\n| ------------ | ------- | ---------------------------------------- | ------------------------------------------------------------------------ |\n| **Basic**    | v1      | stable local links, simplest setup       | lower overhead, no ACK/NAK reliability, no metadata transport            |\n| **Advanced** | v3      | packet loss, variable latency, WAN links | retransmission, congestion control, bonding, metadata, HMAC control auth |\n\nUse **Advanced** for any new deployment on a WAN or unreliable link. Use **Basic** only for stable local links where simplicity and minimum overhead matter.\n\n## Runtime UI and API\n\n- Runtime UI: `/plugins/signalk-edge-link/`\n- API base path: `/plugins/signalk-edge-link`\n- Default API rate limit: **120 requests/minute/IP**\n\nFor a walkthrough of the configuration panel (progressive-disclosure connection\ncards) and the runtime dashboard panels for server and client, see\n[`docs/web-ui.md`](docs/web-ui.md).\n\nMost used endpoints:\n\n- `GET /metrics`\n- `GET /network-metrics`\n- `GET /monitoring/alerts`\n- `GET /connections`\n- `GET /instances`\n- `GET /instances/:id`\n- `GET /connections/:id/metrics`\n- `GET /connections/:id/network-metrics`\n- `GET /bonding`\n- `POST /bonding`\n\nFor full endpoint details, use `docs/api-reference.md`\n\n## Configuration model (summary)\n\nConfiguration is an array of independent connections:\n\n```json\n{\n  \"connections\": [\n    {\n      \"name\": \"shore-server\",\n      \"serverType\": \"server\",\n      \"udpPort\": 4446,\n      \"secretKey\": \"<32-byte key>\",\n      \"protocolVersion\": 3,\n      \"requestFullStatusOnRestart\": false\n    },\n    {\n      \"name\": \"sat-client\",\n      \"serverType\": \"client\",\n      \"udpPort\": 4447,\n      \"udpAddress\": \"10.0.0.1\",\n      \"secretKey\": \"<32-byte key>\",\n      \"protocolVersion\": 3\n    }\n  ]\n}\n```\n\n- Each connection runs independently.\n- Legacy single-object config is auto-normalized to one connection.\n- Client runtime JSON files (`delta_timer.json`, `subscription.json`, `sentence_filter.json`) are stored per connection and can be edited via API.\n- `requestFullStatusOnRestart` (server mode, v3, default `false`): when enabled, the server sends a `FULL_STATUS_REQUEST` to each client on first contact after a (re)start; the client immediately replays its complete values snapshot so the server rebuilds state without waiting for incremental deltas. Client-side rate-limited to 10 s to prevent replay floods across rapid restarts.\n\nFor complete setting definitions and ranges, use `docs/configuration-reference.md`.\n\nSchema and migration helpers:\n\n- The runtime schema is assembled by `buildPluginSchema()` in\n  `src/app/config/schema.ts` from the property definitions in\n  `src/shared/connection-schema.ts`, exposed as `plugin.schema` from\n  `src/index.ts`, and served to the Signal K admin UI.\n  `docs/configuration-reference.md` is the authoritative human-readable\n  reference.\n- `src/scripts/migrate-config.ts` (convert legacy flat config to `connections[]`)\n- `npm run migrate:config -- <input.json> [output.json]`\n\n## Security notes\n\n- Uses AES-256-GCM authenticated encryption.\n- Keys must match exactly and can be entered as 32-character ASCII, 64-character hex, or 44-character base64 (standard or URL-safe).\n- Restrict UDP ingress to trusted source addresses whenever possible.\n- `authenticatedHeaders` (v3, **default on**, both ends must match) adds an HMAC tag binding each DATA/METADATA packet header to its encrypted payload, preventing on-path header tampering. Set to `false` on both peers only to interoperate with a peer that cannot enable it. See `docs/security.md`.\n\nExample key generation:\n\n```bash\nopenssl rand -hex 32\n```\n\n## Troubleshooting\n\nCommon checks:\n\n- Verify `udpAddress`, `udpPort`, and `secretKey` match both ends.\n- Confirm server UDP port is reachable and not already in use.\n- If link quality is poor, switch to **Advanced** (`protocolVersion: 3`) when both peers can upgrade together.\n\n**`testAddress is only supported on v1 clients` after upgrading to Advanced mode**\n\nThe fields `testAddress`, `testPort`, and `pingIntervalTime` belong to the Basic (v1) ping monitor and are not used by Advanced (v3) clients (which derive RTT from HEARTBEAT exchanges instead). If these fields are present in a connection with `protocolVersion: 3` the validator will reject the config.\n\nRemove them from the affected connection:\n\n```json\n{\n  \"name\": \"my-client\",\n  \"serverType\": \"client\",\n  \"protocolVersion\": 3,\n  \"udpAddress\": \"...\",\n  \"heartbeatInterval\": 25000\n}\n```\n\nThe plugin strips these fields automatically on startup, but if you see the error when saving via the SignalK admin UI you need to remove them from the stored config JSON manually once.\n\nFor issue-oriented diagnostics, use `docs/troubleshooting.md`.\n\n## Developer commands\n\n```bash\nnpm run build\nnpm run dev\nnpm test\nnpm run test:v2\nnpm run test:integration\nnpm run lint\nnpm run lint:fix\nnpm run format\nnpm run format:check\nnpm run cli -- help\nnpm run cli -- instances list --token=$EDGE_LINK_TOKEN --state=running --limit=10 --page=1 --format=table\nnpm run cli -- instances show alpha --token=$EDGE_LINK_TOKEN --format=table\nnpm run cli -- instances create --config ./new-instance.json --token=$EDGE_LINK_TOKEN\nnpm run cli -- instances update alpha --patch '{\"udpAddress\":\"10.0.0.2\"}' --token=$EDGE_LINK_TOKEN\nnpm run cli -- instances delete alpha --token=$EDGE_LINK_TOKEN\nnpm run cli -- bonding status --token=$EDGE_LINK_TOKEN --format=table\nnpm run cli -- bonding update --patch '{\"failoverThreshold\":300}' --token=$EDGE_LINK_TOKEN\nnpm run cli -- status --token=$EDGE_LINK_TOKEN --format=table\n```\n\n## Management API security\n\nSet `managementApiToken` in plugin options, or the environment variable\n`SIGNALK_EDGE_LINK_MANAGEMENT_TOKEN` (the environment variable takes\nprecedence).\n\n**Every route is protected.** There is no read-only subset that stays open once\na token is configured — including the ones dashboards and scrapers use:\n\n- `/instances`, `/bonding`, `/status`, `/plugin-config`, `/plugin-schema`\n- `/metrics`, `/network-metrics`, `/prometheus`, `/sources`, `/paths`, `/congestion`\n- `/config/*`, `/connections/:id/config/*`, `/delta-timer`\n- `/connections/:id/metrics`, `/connections/:id/network-metrics`\n- `/connections/:id/bonding`, `/connections/:id/congestion`\n- `/connections/:id/bonding/failover`\n- `/monitoring/*` (alerts, packet-loss, path-latency, retransmissions, inspector, simulation)\n- `/capture/*`\n\nSo configuring a token means updating anything that polls the plugin —\nPrometheus scrape configs included. See [docs/metrics.md](docs/metrics.md).\n\nSend the token as either:\n\n- `X-Edge-Link-Token: <token>`\n- `Authorization: Bearer <token>`\n\nCLI commands support `--token=<token>` or the `SIGNALK_EDGE_LINK_MANAGEMENT_TOKEN` environment variable.\n\n## Web UI token injection\n\nManagement pages automatically attach auth headers when a token is available. Token sources are checked in this order:\n\n1. `window.__EDGE_LINK_AUTH__.token` — injected global (preferred for server-side injection)\n2. URL query parameter `?edgeLinkToken=<token>` — **disabled by default**; opt in with `includeTokenInQuery: true`. Avoid it: tokens in URLs leak via browser history, server access logs, and `Referer` headers.\n3. `localStorage.setItem(\"signalkEdgeLinkManagementToken\", \"<token>\")`\n\nThe UI sends both `X-Edge-Link-Token` and `Authorization: Bearer <token>` by default. Override with:\n\n```javascript\nwindow.__EDGE_LINK_AUTH__ = {\n  token: \"<token>\",\n  queryParam: \"edgeLinkToken\",\n  localStorageKey: \"signalkEdgeLinkManagementToken\",\n  headerMode: \"both\" // \"both\" | \"authorization\" | \"x-edge-link-token\"\n};\n```\n\n## Documentation map\n\n- `docs/README.md` (documentation index)\n- `docs/GUIDE.md` (full setup and operations guide, including topologies)\n- `docs/architecture-overview.md` (system architecture and lifecycle)\n- `docs/web-ui.md` (configuration panel and runtime dashboard, including relay nodes)\n- `docs/configuration-reference.md` (settings and defaults)\n- `docs/api-reference.md`\n- `docs/protocol-v3.md` (Basic/Advanced protocol operational overview)\n- `docs/protocol-v3-spec.md` (RFC-style wire specification with authenticated control plane)\n- `docs/bonding.md` (bonding concepts and API usage)\n- `docs/congestion-control.md` (congestion-control behavior and tuning)\n- `docs/metrics.md` (metrics and monitoring reference)\n- `docs/management-tools.md` (instance/bonding API + CLI operations)\n- `docs/security.md` (security guidance and deployment hardening)\n- `docs/performance-tuning.md` (deployment tuning recommendations by hardware profile)\n- `docs/troubleshooting.md` (issue-oriented diagnostics)\n- `docs/release-checklist.md` (pre-publish verification sequence)\n- `samples/` (example JSON configurations for minimal/dev/bonding setups)\n- `src/scripts/migrate-config.ts` (legacy config migration utility)\n- `src/bin/edge-link-cli.ts` (CLI wrapper for migration and instance/bonding management)\n\n## License\n\nMIT. See `LICENSE`.\n","readmeFilename":"README.md"}