Commit b30a7134bbb2a55afb3cd078c30968afdf773423
1 parent
388f5560
Exists in
master
and in
1 other branch
adiciona suporte a queue
Showing
10 changed files
with
170 additions
and
126 deletions
Show diff stats
endpoints/ios.js
| 1 | 1 | var parameters = require('../helpers/parameters'); |
| 2 | 2 | var properties = require('../helpers/properties'); |
| 3 | - | |
| 3 | +var queue_helper = require('../helpers/queue'); | |
| 4 | 4 | var exec = require('child_process').exec, child; |
| 5 | 5 | var uuid = require('node-uuid'); |
| 6 | 6 | var fs = require('fs'); |
| 7 | +var kue = require('kue'), | |
| 8 | + queue = kue.createQueue(); | |
| 7 | 9 | |
| 8 | 10 | function init(req, res) { |
| 9 | 11 | |
| ... | ... | @@ -22,25 +24,37 @@ function init(req, res) { |
| 22 | 24 | } |
| 23 | 25 | |
| 24 | 26 | /* Cria a linha de comando */ |
| 25 | - var command_line = 'echo ' + req.body.texto + ' >> text_files/' + id + ' && mkdir uploads/' + id + ' && vlibras_user/vlibras-core/./vlibras ' + parameters.getServiceType(req.body.servico) + ' text_files/' + | |
| 27 | + var command_line = 'echo ' + req.body.texto + ' >> text_files/' + id + ' && mkdir uploads/' + id + ' && vlibras_user/vlibras-core/./vlibras ' + parameters.getServiceType(req.body.servico) + ' text_files/' + | |
| 26 | 28 | id + ' ' + parameters.getTransparency(req.body.transparencia) + ' ' + id + ' IOS > /tmp/core_log 2>&1'; |
| 27 | 29 | |
| 28 | - console.log(command_line) | |
| 30 | + console.log(command_line); | |
| 29 | 31 | |
| 30 | 32 | /* Executa a linha de comando */ |
| 31 | - child = exec(command_line, function(err, stdout, stderr) { | |
| 32 | - // [stdout] = vlibras-core output | |
| 33 | + // child = exec(command_line, function(err, stdout, stderr) { | |
| 34 | + // // [stdout] = vlibras-core output | |
| 35 | + // }); | |
| 36 | + | |
| 37 | + var child; | |
| 38 | + var job = queue.create('exec_command_line', { | |
| 39 | + title: 'Command Line for: ' + req.body.servico, | |
| 40 | + command_line: command_line | |
| 41 | + }).save(); | |
| 42 | + | |
| 43 | + queue.process('exec_command_line', function(job, done){ | |
| 44 | + child = queue_helper.exec_command_line(job.data.command_line, done); | |
| 33 | 45 | }); |
| 34 | 46 | |
| 35 | - /* Listener que dispara quando a requisição ao core finaliza */ | |
| 36 | - child.on('close', function(code, signal){ | |
| 37 | - res.send(200, { 'response' : 'http://' + properties.SERVER_IP + ':' + properties.port + '/' + id + '.mp4' }); | |
| 38 | - }); | |
| 47 | + job.on('complete', function() { | |
| 48 | + /* Listener que dispara quando a requisição ao core finaliza */ | |
| 49 | + child.on('close', function(code, signal){ | |
| 50 | + res.send(200, { 'response' : 'http://' + properties.SERVER_IP + ':' + properties.port + '/' + id + '.mp4' }); | |
| 51 | + }); | |
| 39 | 52 | |
| 40 | - /* Listener que dispara quando a requisição ao core da erro */ | |
| 41 | - child.on('error', function(code, signal){ | |
| 42 | - res.send(500, parameters.errorMessage('Erro na chamada ao core')); | |
| 53 | + /* Listener que dispara quando a requisição ao core da erro */ | |
| 54 | + child.on('error', function(code, signal){ | |
| 55 | + res.send(500, parameters.errorMessage('Erro na chamada ao core')); | |
| 56 | + }); | |
| 43 | 57 | }); |
| 44 | -}; | |
| 58 | +} | |
| 45 | 59 | |
| 46 | 60 | module.exports.init = init; | ... | ... |
endpoints/legenda.js
| 1 | 1 | var parameters = require('../helpers/parameters'); |
| 2 | 2 | var properties = require('../helpers/properties'); |
| 3 | - | |
| 3 | +var queue_helper = require('../helpers/queue'); | |
| 4 | 4 | var exec = require('child_process').exec, child; |
| 5 | 5 | var uuid = require('node-uuid'); |
| 6 | 6 | var fs = require('fs'); |
| 7 | +var kue = require('kue'), | |
| 8 | + queue = kue.createQueue(); | |
| 7 | 9 | |
| 8 | 10 | function init(req, res) { |
| 9 | 11 | |
| ... | ... | @@ -42,21 +44,33 @@ function init(req, res) { |
| 42 | 44 | req.files.legenda.name + ' ' + parameters.getTransparency(req.body.transparencia) + ' ' + id; |
| 43 | 45 | |
| 44 | 46 | /* Executa a linha de comando */ |
| 45 | - child = exec(command_line, function(err, stdout, stderr) { | |
| 46 | - // [stdout] = vlibras-core output | |
| 47 | - // console.log(stdout); | |
| 48 | - }); | |
| 47 | + // child = exec(command_line, function(err, stdout, stderr) { | |
| 48 | + // // [stdout] = vlibras-core output | |
| 49 | + // // console.log(stdout); | |
| 50 | + // }); | |
| 49 | 51 | |
| 50 | - /* Listener que dispara quando a requisição ao core finaliza */ | |
| 51 | - child.on('close', function(code, signal){ | |
| 52 | - res.send(200, { 'response' : 'http://' + properties.SERVER_IP + ':' + properties.port + '/' + id + '.flv' }); | |
| 53 | - }); | |
| 52 | + var job = queue.create('exec_command_line', { | |
| 53 | + title: 'Command Line for: ' + req.body.servico, | |
| 54 | + command_line: command_line | |
| 55 | + }).save(); | |
| 54 | 56 | |
| 55 | - /* Listener que dispara quando a requisição ao core da erro */ | |
| 56 | - child.on('error', function(code, signal){ | |
| 57 | - res.send(500, parameters.errorMessage('Erro na chamada ao core')); | |
| 57 | + queue.process('exec_command_line', function(job, done){ | |
| 58 | + child = queue_helper.exec_command_line(job.data.command_line, done); | |
| 58 | 59 | }); |
| 60 | + | |
| 61 | + job.on('complete', function() { | |
| 62 | + /* Listener que dispara quando a requisição ao core finaliza */ | |
| 63 | + child.on('close', function(code, signal){ | |
| 64 | + res.send(200, { 'response' : 'http://' + properties.SERVER_IP + ':' + properties.port + '/' + id + '.flv' }); | |
| 65 | + }); | |
| 66 | + | |
| 67 | + /* Listener que dispara quando a requisição ao core da erro */ | |
| 68 | + child.on('error', function(code, signal){ | |
| 69 | + res.send(500, parameters.errorMessage('Erro na chamada ao core')); | |
| 70 | + }); | |
| 71 | + }) | |
| 72 | + | |
| 59 | 73 | }); |
| 60 | 74 | }; |
| 61 | 75 | |
| 62 | -module.exports.init = init; | |
| 63 | 76 | \ No newline at end of file |
| 77 | +module.exports.init = init; | ... | ... |
endpoints/texto.js
| ... | ... | @@ -34,7 +34,8 @@ function init(req, res, Request) { |
| 34 | 34 | |
| 35 | 35 | db.create(request_object, function(result) { |
| 36 | 36 | if (result !== null) { |
| 37 | - res.send(200, { 'status': 'Requisição ' + result.id + ' cadastrada com sucesso.'}); | |
| 37 | + // TODO retornar ID do video | |
| 38 | + res.send(200, { 'status': 'Requisição ' + result.id + ' cadastrada com sucesso.', 'video_id': result.id}); | |
| 38 | 39 | } else { |
| 39 | 40 | res.send(500, { 'error': 'Erro na criação da requisição.'}); |
| 40 | 41 | } |
| ... | ... | @@ -42,55 +43,36 @@ function init(req, res, Request) { |
| 42 | 43 | |
| 43 | 44 | /* Cria a linha de comando */ |
| 44 | 45 | var command_line = 'echo ' + req.body.texto + ' >> text_files/' + id + ' && mkdir uploads/' + id + ' && vlibras_user/vlibras-core/./vlibras ' + parameters.getServiceType(req.body.servico) + ' text_files/' + |
| 45 | - id + ' ' + parameters.getTransparency(req.body.transparencia) + ' ' + id + ' WEB > /tmp/core_log 2>&1'; | |
| 46 | - | |
| 47 | -console.log(command_line); | |
| 46 | + id + ' ' + parameters.getTransparency(req.body.transparencia) + ' ' + id + ' Web > /tmp/core_log 2>&1'; | |
| 48 | 47 | |
| 48 | + console.log(command_line); | |
| 49 | + var child; | |
| 49 | 50 | var job = queue.create('exec_command_line', { |
| 50 | 51 | title: 'Command Line for: ' + req.body.servico, |
| 51 | 52 | command_line: command_line |
| 52 | 53 | }).save(); |
| 53 | 54 | |
| 54 | - | |
| 55 | - /* Executa a linha de comando */ | |
| 56 | - // child = exec(command_line, function(err, stdout, stderr) { | |
| 57 | - // // [stdout] = vlibras-core output | |
| 58 | - // }); | |
| 59 | - | |
| 60 | - | |
| 61 | - // vai remover isso em cima e colocar isso aqui | |
| 62 | 55 | queue.process('exec_command_line', function(job, done){ |
| 63 | - queue_helper.exec_command_line(job.data.command_line, done); | |
| 56 | + child = queue_helper.exec_command_line(job.data.command_line, done); | |
| 64 | 57 | }); |
| 65 | 58 | |
| 66 | - job.on('complete', function(){ | |
| 67 | - console.log("Job complete"); | |
| 59 | + job.on('complete', function() { | |
| 60 | + /* Listener que dispara quando a requisição ao core finaliza */ | |
| 61 | + child.on('close', function(code, signal) { | |
| 62 | + // res.send(200, { 'response' : 'http://' + properties.SERVER_IP + ':' + properties.port + '/' + id + '.webm' }); | |
| 68 | 63 | db.update(request_object, 'Completed', function(result) { |
| 69 | - }); | |
| 64 | + }); | |
| 65 | + }); | |
| 70 | 66 | |
| 71 | - }).on('failed', function(){ | |
| 72 | - console.log("Job failed"); | |
| 73 | - res.send(500, parameters.errorMessage('Erro na chamada ao core')); | |
| 74 | - db.update(request_object, 'Error', function(result) { | |
| 75 | - }); | |
| 76 | - }).on('progress', function(progress){ | |
| 77 | - process.stdout.write('\r job #' + job.id + ' ' + progress + '% complete'); | |
| 78 | - }); | |
| 67 | + /* Listener que dispara quando a requisição ao core da erro */ | |
| 68 | + child.on('error', function(code, signal){ | |
| 69 | + res.send(500, parameters.errorMessage('Erro na chamada ao core')); | |
| 70 | + db.update(request_object, 'Error', function(result) { | |
| 71 | + }); | |
| 72 | + }); | |
| 79 | 73 | |
| 74 | + }); | |
| 80 | 75 | |
| 81 | - /* Listener que dispara quando a requisição ao core finaliza */ | |
| 82 | -// child.on('close', function(code, signal){ | |
| 83 | -// // res.send(200, { 'response' : 'http://' + properties.SERVER_IP + ':' + properties.port + '/' + id + '.webm' }); | |
| 84 | -// db.update(request_object, 'Completed', function(result) { | |
| 85 | -// }); | |
| 86 | -// }); | |
| 87 | -// | |
| 88 | -// /* Listener que dispara quando a requisição ao core da erro */ | |
| 89 | -// child.on('error', function(code, signal){ | |
| 90 | -// res.send(500, parameters.errorMessage('Erro na chamada ao core')); | |
| 91 | -// db.update(request_object, 'Error', function(result) { | |
| 92 | -// }); | |
| 93 | -// }); | |
| 94 | 76 | } |
| 95 | 77 | |
| 96 | 78 | module.exports.init = init; | ... | ... |
endpoints/video.js
| ... | ... | @@ -21,7 +21,7 @@ function init(req, res) { |
| 21 | 21 | res.send(500, parameters.errorMessage('Parâmetros insuficientes ou inválidos')); |
| 22 | 22 | return; |
| 23 | 23 | } |
| 24 | - | |
| 24 | + | |
| 25 | 25 | process(req, res); |
| 26 | 26 | }; |
| 27 | 27 | |
| ... | ... | @@ -29,7 +29,7 @@ function process(req, res) { |
| 29 | 29 | var id = uuid.v4(); |
| 30 | 30 | var folder = properties.uploads_folder + id; |
| 31 | 31 | var locals = {}; |
| 32 | - | |
| 32 | + | |
| 33 | 33 | async.series([ |
| 34 | 34 | // Cria a pasta apropriada |
| 35 | 35 | function(callback) { | ... | ... |
endpoints/video_legenda.js
| ... | ... | @@ -21,7 +21,7 @@ function init(req, res) { |
| 21 | 21 | res.send(500, parameters.errorMessage('Parâmetros insuficientes ou inválidos')); |
| 22 | 22 | return; |
| 23 | 23 | } |
| 24 | - | |
| 24 | + | |
| 25 | 25 | process(req, res); |
| 26 | 26 | }; |
| 27 | 27 | |
| ... | ... | @@ -29,7 +29,7 @@ function process(req, res) { |
| 29 | 29 | var id = uuid.v4(); |
| 30 | 30 | var folder = properties.uploads_folder + id; |
| 31 | 31 | var locals = {}; |
| 32 | - | |
| 32 | + | |
| 33 | 33 | async.series([ |
| 34 | 34 | // Cria a pasta apropriada |
| 35 | 35 | function(callback) { | ... | ... |
helpers/core.js
| 1 | 1 | var requests = require('../helpers/requests'); |
| 2 | 2 | var properties = require('../helpers/properties'); |
| 3 | - | |
| 3 | +var queue_helper = require('../helpers/queue'); | |
| 4 | 4 | var url = require('url'); |
| 5 | 5 | var http = require('http'); |
| 6 | 6 | var querystring = require('querystring'); |
| 7 | 7 | var exec = require('child_process').exec, child; |
| 8 | +var kue = require('kue'), | |
| 9 | + queue = kue.createQueue(); | |
| 8 | 10 | |
| 9 | 11 | function call(id, command_line, req, res) { |
| 10 | 12 | /* Executa a linha de comando */ |
| 11 | - child = exec(command_line, function(err, stdout, stderr) { | |
| 12 | - // [stdout] = vlibras-core output | |
| 13 | - // console.log('Err: ' + err); | |
| 14 | - // console.log('STDOUT: ' + stdout); | |
| 15 | - // console.log('STDERR: ' + stderr); | |
| 13 | + // child = exec(command_line, function(err, stdout, stderr) { | |
| 14 | + // // [stdout] = vlibras-core output | |
| 15 | + // // console.log('Err: ' + err); | |
| 16 | + // // console.log('STDOUT: ' + stdout); | |
| 17 | + // // console.log('STDERR: ' + stderr); | |
| 18 | + // }); | |
| 19 | + | |
| 20 | + var child, | |
| 21 | + job = queue.create('exec_command_line', { | |
| 22 | + title: 'Command Line for: ' + req.body.servico, | |
| 23 | + command_line: command_line | |
| 24 | + }).save(); | |
| 25 | + | |
| 26 | + queue.process('exec_command_line', function(job, done){ | |
| 27 | + child = queue_helper.exec_command_line(job.data.command_line, done); | |
| 28 | + if (child === undefined) { | |
| 29 | + throw "Erro ao conectar com o core"; | |
| 30 | + } | |
| 16 | 31 | }); |
| 17 | 32 | |
| 18 | - // Se o callback não foi definido | |
| 19 | - if (req.body.callback === undefined) { | |
| 33 | + job.on('complete', function() { | |
| 34 | + // Se o callback não foi definido | |
| 35 | + if (req.body.callback === undefined) { | |
| 20 | 36 | |
| 21 | - // Se a chamada foi feita com sucesso | |
| 22 | - child.on('close', function(code, signal) { | |
| 37 | + // Se a chamada foi feita com sucesso | |
| 38 | + child.on('close', function(code, signal) { | |
| 23 | 39 | |
| 24 | - // Se o core executou com erro | |
| 25 | - if (code !== 0) { | |
| 26 | - throw "Erro no retorno do core. Código: " + code; | |
| 27 | - } | |
| 40 | + // Se o core executou com erro | |
| 41 | + if (code !== 0) { | |
| 42 | + throw "Erro no retorno do core. Código: " + code; | |
| 43 | + } | |
| 28 | 44 | |
| 29 | - // Se o core executou normal | |
| 30 | - res.send(200, { 'response' : 'http://' + properties.SERVER_IP + ':' + properties.port + '/' + id + '.mp4'}); | |
| 31 | - }); | |
| 45 | + // Se o core executou normal | |
| 46 | + res.send(200, { 'response' : 'http://' + properties.SERVER_IP + ':' + properties.port + '/' + id + '.mp4'}); | |
| 47 | + }); | |
| 32 | 48 | |
| 33 | - // Se a chamada deu erro | |
| 34 | - child.on('error', function(code, signal) { | |
| 35 | - throw "Erro na chamada ao core"; | |
| 36 | - }); | |
| 49 | + // Se a chamada deu erro | |
| 50 | + child.on('error', function(code, signal) { | |
| 51 | + throw "Erro na chamada ao core"; | |
| 52 | + }); | |
| 37 | 53 | |
| 38 | 54 | |
| 39 | - // Se o callback foi definido | |
| 40 | - } else { | |
| 55 | + // Se o callback foi definido | |
| 56 | + } else { | |
| 41 | 57 | |
| 42 | - // Se a chamada foi feita com sucesso | |
| 43 | - child.on('close', function(code, signal) { | |
| 58 | + // Se a chamada foi feita com sucesso | |
| 59 | + child.on('close', function(code, signal) { | |
| 44 | 60 | |
| 45 | - // Endereço do callback | |
| 46 | - var path = url.parse(req.body.callback); | |
| 61 | + // Endereço do callback | |
| 62 | + var path = url.parse(req.body.callback); | |
| 47 | 63 | |
| 48 | - // Se o core executou com erro | |
| 49 | - if (code === 0) { | |
| 50 | - var data = querystring.stringify({ 'response' : 'http://' + properties.SERVER_IP + ':' + properties.port + '/' + id + '.mp4', 'id' : id }); | |
| 51 | - } else { | |
| 52 | - var data = querystring.stringify({ 'error': 'Erro no Core', 'code': code, 'id' : id }); | |
| 53 | - } | |
| 64 | + // Se o core executou com erro | |
| 65 | + if (code === 0) { | |
| 66 | + var data = querystring.stringify({ 'response' : 'http://' + properties.SERVER_IP + ':' + properties.port + '/' + id + '.mp4', 'id' : id }); | |
| 67 | + } else { | |
| 68 | + var data = querystring.stringify({ 'error': 'Erro no Core', 'code': code, 'id' : id }); | |
| 69 | + } | |
| 54 | 70 | |
| 55 | - // Chama o callback | |
| 56 | - requests.postRequest(path, data); | |
| 57 | - }); | |
| 71 | + // Chama o callback | |
| 72 | + requests.postRequest(path, data); | |
| 73 | + }); | |
| 58 | 74 | |
| 59 | - // Se a chamada deu erro | |
| 60 | - child.on('error', function(code, signal) { | |
| 61 | - var path = url.parse(req.body.callback); | |
| 62 | - var data = querystring.stringify( { 'error': 'Erro na chamada ao core', 'code': code, 'id': id } ); | |
| 75 | + // Se a chamada deu erro | |
| 76 | + child.on('error', function(code, signal) { | |
| 77 | + var path = url.parse(req.body.callback); | |
| 78 | + var data = querystring.stringify( { 'error': 'Erro na chamada ao core', 'code': code, 'id': id } ); | |
| 63 | 79 | |
| 64 | - requests.postRequest(path, data); | |
| 65 | - }); | |
| 80 | + requests.postRequest(path, data); | |
| 81 | + }); | |
| 66 | 82 | |
| 67 | - // Retorno da primeira requisição | |
| 68 | - res.send(200, JSON.stringify({ 'id': id })); | |
| 69 | - } | |
| 83 | + // Retorno da primeira requisição | |
| 84 | + res.send(200, JSON.stringify({ 'id': id })); | |
| 85 | + } | |
| 86 | + }); | |
| 70 | 87 | } |
| 71 | 88 | |
| 72 | -module.exports.call = call; | |
| 73 | 89 | \ No newline at end of file |
| 90 | +module.exports.call = call; | ... | ... |
helpers/queue.js
| 1 | 1 | var exec = require('child_process').exec, child; |
| 2 | 2 | |
| 3 | 3 | exports.exec_command_line = function (command_line, callback) { |
| 4 | - child = exec(command_line, function(err, stdout, stderr) { | |
| 5 | - // [stdout] = vlibras-core output | |
| 6 | - }); | |
| 7 | - callback(); | |
| 4 | + | |
| 5 | + child = exec(command_line, function(err, stdout, stderr) { | |
| 6 | + // console.log('Err: ' + err); | |
| 7 | + // console.log('STDOUT: ' + stdout); | |
| 8 | + // console.log('STDERR: ' + stderr); | |
| 9 | + }); | |
| 10 | + //callback(); | |
| 11 | + // if (child === undefined) { | |
| 12 | + // throw "Erro ao conectar com o core"; | |
| 13 | + // } | |
| 14 | + child.on('error', function(code, signal) { | |
| 15 | + throw "Erro ao conectar com o core"; | |
| 16 | + }); | |
| 17 | + child.on('disconnect', function(code, signal) { | |
| 18 | + throw "Disconectado do core"; | |
| 19 | + }); | |
| 20 | + return child; | |
| 21 | + | |
| 8 | 22 | }; | ... | ... |
node_modules/ip/package.json
| 1 | 1 | { |
| 2 | 2 | "name": "ip", |
| 3 | - "version": "0.3.2", | |
| 3 | + "version": "0.3.3", | |
| 4 | 4 | "author": { |
| 5 | 5 | "name": "Fedor Indutny", |
| 6 | 6 | "email": "fedor@indutny.com" |
| ... | ... | @@ -8,7 +8,7 @@ |
| 8 | 8 | "homepage": "https://github.com/indutny/node-ip", |
| 9 | 9 | "repository": { |
| 10 | 10 | "type": "git", |
| 11 | - "url": "http://github.com/indutny/node-ip.git" | |
| 11 | + "url": "git+ssh://git@github.com/indutny/node-ip.git" | |
| 12 | 12 | }, |
| 13 | 13 | "main": "lib/ip", |
| 14 | 14 | "devDependencies": { |
| ... | ... | @@ -17,15 +17,17 @@ |
| 17 | 17 | "scripts": { |
| 18 | 18 | "test": "mocha --reporter spec test/*-test.js" |
| 19 | 19 | }, |
| 20 | - "gitHead": "978e13d19531c9d9172044654df9dfb7ed116e45", | |
| 20 | + "license": "MIT", | |
| 21 | + "gitHead": "7798e2d222718087863d8a5a99e3c02f3a30e2b9", | |
| 21 | 22 | "description": "IP address utilities for node.js", |
| 22 | 23 | "bugs": { |
| 23 | 24 | "url": "https://github.com/indutny/node-ip/issues" |
| 24 | 25 | }, |
| 25 | - "_id": "ip@0.3.2", | |
| 26 | - "_shasum": "7d5ed34326688b36b6ab81f1865ea8266c28f0db", | |
| 26 | + "_id": "ip@0.3.3", | |
| 27 | + "_shasum": "8ee8309e92f0b040d287f72efaca1a21702d3fb4", | |
| 27 | 28 | "_from": "ip@latest", |
| 28 | - "_npmVersion": "1.4.28", | |
| 29 | + "_npmVersion": "2.9.0", | |
| 30 | + "_nodeVersion": "2.0.0", | |
| 29 | 31 | "_npmUser": { |
| 30 | 32 | "name": "indutny", |
| 31 | 33 | "email": "fedor@indutny.com" |
| ... | ... | @@ -45,9 +47,9 @@ |
| 45 | 47 | } |
| 46 | 48 | ], |
| 47 | 49 | "dist": { |
| 48 | - "shasum": "7d5ed34326688b36b6ab81f1865ea8266c28f0db", | |
| 49 | - "tarball": "http://registry.npmjs.org/ip/-/ip-0.3.2.tgz" | |
| 50 | + "shasum": "8ee8309e92f0b040d287f72efaca1a21702d3fb4", | |
| 51 | + "tarball": "http://registry.npmjs.org/ip/-/ip-0.3.3.tgz" | |
| 50 | 52 | }, |
| 51 | 53 | "directories": {}, |
| 52 | - "_resolved": "https://registry.npmjs.org/ip/-/ip-0.3.2.tgz" | |
| 54 | + "_resolved": "https://registry.npmjs.org/ip/-/ip-0.3.3.tgz" | |
| 53 | 55 | } | ... | ... |