├── .gitignore ├── .npmignore ├── README.md ├── config ├── development.json └── test.json ├── fetch.js ├── index.js ├── package.json ├── service-names-port-numbers.json └── test ├── fixture.csv ├── index.js └── server.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | test 2 | config 3 | fetch.js 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # service-names-port-numbers 2 | 3 | A simple json list with IANA assigned port numbers. See IANAs [Service Name and Transport Protocol Port Number Registry](https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml) for more details. 4 | 5 | npm install service-names-port-numbers 6 | 7 | # Usage 8 | 9 | ```javascript 10 | var ports = require('service-names-port-numbers')(); 11 | ``` 12 | 13 | In the above example `ports` is an array containg objects with following format. 14 | 15 | ```javascript 16 | { 17 | ServiceName: 'test', 18 | PortNumber: '1024', 19 | TransportProtocol: 'tcp', 20 | Description: 'Test service', 21 | Assignee: '[Assignee]', 22 | Contact: '[Contact]', 23 | RegistrationDate: '2015-07-01', 24 | ModificationDate: '2015-07-01', 25 | Reference: '[RFC-reference]', 26 | ServiceCode: '000000', 27 | KnownUnauthorizedUses: 'Unauthorized use by IANA', 28 | AssignmentNotes: 'Test entry' 29 | } 30 | ``` 31 | 32 | Note that not all properties are necessarily present on each entry. 33 | -------------------------------------------------------------------------------- /config/development.json: -------------------------------------------------------------------------------- 1 | { 2 | "url": "https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.csv" 3 | } 4 | -------------------------------------------------------------------------------- /config/test.json: -------------------------------------------------------------------------------- 1 | { 2 | "port": "10501", 3 | "url": "http://localhost:{port}/service-names-port-numbers.csv" 4 | } 5 | -------------------------------------------------------------------------------- /fetch.js: -------------------------------------------------------------------------------- 1 | var request = require('request'); 2 | var csvParse = require('csv-parse'); 3 | var isOk = require('is-ok'); 4 | var param = require('param'); 5 | 6 | var fetch = function(callback) { 7 | request(param('url'), function(err, response, body) { 8 | if(err) return callback(err); 9 | if(!isOk(response, callback)) return; 10 | 11 | csvParse(body, { columns: true }, function(err, data) { 12 | if(err) return callback(err); 13 | 14 | data = data.map(function(entry) { 15 | return Object.keys(entry).reduce(function(acc, key) { 16 | if(entry[key] !== '') acc[key.replace(/\s+/g, '')] = entry[key]; 17 | return acc; 18 | }, {}); 19 | }); 20 | 21 | callback(null, data); 22 | }); 23 | }); 24 | }; 25 | 26 | module.exports = fetch; 27 | 28 | if(require.main === module) { 29 | fetch(function(err, data) { 30 | if(err) throw err; 31 | console.log(JSON.stringify(data, null, 4)); 32 | }); 33 | } 34 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | var ports = require('./service-names-port-numbers.json'); 2 | 3 | module.exports = function() { 4 | return JSON.parse(JSON.stringify(ports)); 5 | }; 6 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "service-names-port-numbers", 3 | "version": "2.0.0", 4 | "description": "IANA assigned port numbers", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "NODE_ENV=test tape test/index.js", 8 | "fetch": "node fetch.js > service-names-port-numbers.json" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/kapetan/service-names-port-numbers.git" 13 | }, 14 | "keywords": [ 15 | "iana", 16 | "service", 17 | "name", 18 | "port", 19 | "number" 20 | ], 21 | "license": "MIT", 22 | "bugs": { 23 | "url": "https://github.com/kapetan/service-names-port-numbers/issues" 24 | }, 25 | "homepage": "https://github.com/kapetan/service-names-port-numbers#readme", 26 | "devDependencies": { 27 | "csv-parse": "^0.1.3", 28 | "is-ok": "^1.0.1", 29 | "param": "^1.0.1", 30 | "request": "^2.60.0", 31 | "tape": "^4.0.1" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /test/fixture.csv: -------------------------------------------------------------------------------- 1 | Service Name,Port Number,Transport Protocol,Description,Assignee,Contact,Registration Date,Modification Date,Reference,Service Code,Known Unauthorized Uses,Assignment Notes 2 | ,1023,tcp,Reserved,,,,,,,, 3 | test,1024,tcp,Test service,[Assignee],[Contact],2015-07-01,2015-07-01,[RFC-reference],000000,Unauthorized use by IANA,Test entry 4 | -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | var test = require('tape'); 2 | var server = require('./server'); 3 | var fetch = require('../fetch'); 4 | var ports = require('../'); 5 | 6 | test('fetch csv', function(t) { 7 | server(function() { 8 | fetch(function(err, data) { 9 | t.error(err); 10 | 11 | t.deepEqual(data, [{ 12 | PortNumber: '1023', 13 | TransportProtocol: 'tcp', 14 | Description: 'Reserved' 15 | }, { 16 | ServiceName: 'test', 17 | PortNumber: '1024', 18 | TransportProtocol: 'tcp', 19 | Description: 'Test service', 20 | Assignee: '[Assignee]', 21 | Contact: '[Contact]', 22 | RegistrationDate: '2015-07-01', 23 | ModificationDate: '2015-07-01', 24 | Reference: '[RFC-reference]', 25 | ServiceCode: '000000', 26 | KnownUnauthorizedUses: 'Unauthorized use by IANA', 27 | AssignmentNotes: 'Test entry' 28 | }]); 29 | 30 | t.end(); 31 | }); 32 | }); 33 | }); 34 | 35 | test('ports', function(t) { 36 | var list = ports(); 37 | 38 | t.ok(Array.isArray(list)); 39 | t.ok(list.length > 0); 40 | t.end(); 41 | }); 42 | -------------------------------------------------------------------------------- /test/server.js: -------------------------------------------------------------------------------- 1 | var http = require('http'); 2 | var fs = require('fs'); 3 | var path = require('path'); 4 | var param = require('param'); 5 | 6 | var CSV = fs.readFileSync(path.join(__dirname, 'fixture.csv')); 7 | 8 | module.exports = function(callback) { 9 | var server = http.createServer(function(request, response) { 10 | response.writeHead(200, { 11 | 'Content-Length': CSV.length, 12 | 'Content-Type': 'text/csv; charset=utf-8' 13 | }); 14 | 15 | response.end(CSV); 16 | }); 17 | 18 | server.listen(param('port'), callback); 19 | server.unref(); 20 | 21 | return server; 22 | }; 23 | --------------------------------------------------------------------------------