Commit 23b21377 authored by Shah Rinku's avatar Shah Rinku

added partial support for routing at nic

parent bc8d9766
...@@ -13,6 +13,8 @@ const { createLogger, format, transports } = winston; ...@@ -13,6 +13,8 @@ const { createLogger, format, transports } = winston;
const heap = require('heap') const heap = require('heap')
const dgram = require('dgram'); const dgram = require('dgram');
const udpProxy = dgram.createSocket('udp4'); const udpProxy = dgram.createSocket('udp4');
let struct = require('jspack')
struct = struct.jspack
let db = sharedMeta.db, // queue holding request to be dispatched let db = sharedMeta.db, // queue holding request to be dispatched
...@@ -144,14 +146,21 @@ async function reverseProxy(req, res) { ...@@ -144,14 +146,21 @@ async function reverseProxy(req, res) {
logger.error("error" + err) logger.error("error" + err)
} }
} else if (req.body.type === "udp") { } else if (req.body.type === "udp") {
let request_id = makeid(4) let request_id = Math.floor(Math.random() * 1000)
req.body.request_id = request_id req.body.request_id = request_id
// res.request_id = request_id // res.request_id = request_id
requestFlightQueue.set(request_id, res) requestFlightQueue.set(request_id, res)
let payload = req.body let payload = req.body
payload.request_id = request_id payload.request_id = request_id
payload = JSON.stringify(payload) let data = payload.data
udpProxy.send(payload, 0, payload.length, resource.port, resource.node_id, function (err, bytes) { let packet = packPacket({
chain_id: 0,
exec_id: request_id,
function_id: 0,
data,
function_count: 1
})
udpProxy.send(packet, 0, packet.length, resource.port, resource.node_id, function (err, bytes) {
// logger.info(`forwarded request via UDP, IP 192.168.2.5 Port ${resource.port}`) // logger.info(`forwarded request via UDP, IP 192.168.2.5 Port ${resource.port}`)
}) })
} }
...@@ -403,8 +412,8 @@ udpProxy.on('error', (err) => { ...@@ -403,8 +412,8 @@ udpProxy.on('error', (err) => {
}); });
udpProxy.on('message', (msg, rinfo) => { udpProxy.on('message', (msg, rinfo) => {
let result = JSON.parse(msg) let result = unpackPacket(msg)
let res = requestFlightQueue.get(result.request_id) let res = requestFlightQueue.get(result.exec_id)
res.json(result) res.json(result)
}); });
...@@ -422,6 +431,48 @@ async function fetchData(url, data = null) { ...@@ -422,6 +431,48 @@ async function fetchData(url, data = null) {
return await res.json() return await res.json()
} }
function unpackPacket(packet) {
// let buffer = new Array(1024)
let chain_id = null, exec_id = null, function_count = null, function_id = null, data = null
let base = 0
chain_id = struct.Unpack(">I", packet, base)
base += 4
exec_id = struct.Unpack(">I", packet, base)
base += 4
function_id = struct.Unpack(">I", packet, base)
base += 1
data = struct.Unpack(">I", packet, base)
base += 4
function_count = struct.Unpack("B", packet, base)
return {
chain_id: chain_id[0],
exec_id: exec_id[0],
data: data[0],
function_count: function_count[0],
function_id: function_id[0]
}
}
function packPacket(dataPacket) {
let message = new Array(1024)
let base = 0, chain_id, exec_id, function_id, data, function_count
chain_id = struct.PackTo(">I", message, base, [dataPacket.chain_id])
base += 4
exec_id = struct.PackTo(">I", message, base, [dataPacket.exec_id])
base += 4
function_id = struct.PackTo(">I", message, base, [dataPacket.function_id])
base += 1
data = struct.PackTo(">I", message, base, [dataPacket.data])
base += 4
function_count = struct.PackTo("B", message, base, [dataPacket.function_count])
message = Buffer.from(message)
return message
}
udpProxy.bind(constants.master_port); // starting UDP server for offloaded endpoints udpProxy.bind(constants.master_port); // starting UDP server for offloaded endpoints
module.exports = { module.exports = {
......
#! /bin/bash -x #! /bin/bash -ex
compile_flag=0 compile_flag=0
offload_flag=0
assign_ip_flag=0
location=$(pwd) location=$(pwd)
while getopts 'c' flag; do while getopts 'coi' flag; do
case "${flag}" in case "${flag}" in
c) compile_flag=1 ;; c) compile_flag=1 ;;
o) offload_flag=1 ;;
i) assign_ip_flag=1 ;;
esac esac
done done
...@@ -13,11 +17,24 @@ then ...@@ -13,11 +17,24 @@ then
# compile the nfp code # compile the nfp code
sudo /opt/netronome/p4/bin/nfp4build -o ./p4src/echo.nffw -p ./p4src/out -4 ./p4src/echo.p4 -l lithium --nfp4c_p4_version 16 --nfp4c_p4_compiler p4c-nfp -c ./p4src/prime.c sudo /opt/netronome/p4/bin/nfp4build -o ./p4src/echo.nffw -p ./p4src/out -4 ./p4src/echo.p4 -l lithium --nfp4c_p4_version 16 --nfp4c_p4_compiler p4c-nfp -c ./p4src/prime.c
fi fi
# move to p4 bin
cd /opt/netronome/p4/bin/
# #offload if [[ $offload_flag -eq 1 ]]
sudo ./rtecli design-load -f $location/p4src/echo.nffw -c $location/p4src/echo.p4cfg -p $location/p4src/out/pif_design.json then
# move to p4 bin
cd /opt/netronome/p4/bin/
# offload
sudo ./rtecli design-load -f $location/p4src/echo.nffw -c $location/p4src/echo.p4cfg -p $location/p4src/out/pif_design.json
# returning back to base
cd $location
fi
if [[ $assign_ip_flag -eq 1 ]]
then
#killing all running containers
docker stop $(docker ps -a -q) || true
#assigning IPs to network interfaces
sudo ./assign_ip.sh
fi
# returning back to base
cd $location
\ No newline at end of file
...@@ -8,10 +8,7 @@ ...@@ -8,10 +8,7 @@
{ {
"name" : "scalars_0", "name" : "scalars_0",
"id" : 0, "id" : 0,
"fields" : [ "fields" : []
["temp", 32, false],
["tempEth", 48, false]
]
}, },
{ {
"name" : "ethernet_t", "name" : "ethernet_t",
...@@ -56,7 +53,7 @@ ...@@ -56,7 +53,7 @@
"fields" : [ "fields" : [
["chain_id", 32, false], ["chain_id", 32, false],
["exec_id", 32, false], ["exec_id", 32, false],
["function_id", 8, false], ["function_id", 32, false],
["data", 32, false], ["data", 32, false],
["function_count", 8, false], ["function_count", 8, false],
["f0", 8, false], ["f0", 8, false],
...@@ -257,7 +254,7 @@ ...@@ -257,7 +254,7 @@
], ],
"transitions" : [ "transitions" : [
{ {
"value" : "0x22b9", "value" : "0x1f40",
"mask" : null, "mask" : null,
"next_state" : "parse_map_hdr" "next_state" : "parse_map_hdr"
}, },
...@@ -362,7 +359,7 @@ ...@@ -362,7 +359,7 @@
"id" : 0, "id" : 0,
"source_info" : { "source_info" : {
"filename" : "p4src/echo.p4", "filename" : "p4src/echo.p4",
"line" : 97, "line" : 89,
"column" : 8, "column" : 8,
"source_fragment" : "DeparserImpl" "source_fragment" : "DeparserImpl"
}, },
...@@ -403,7 +400,7 @@ ...@@ -403,7 +400,7 @@
"id" : 0, "id" : 0,
"source_info" : { "source_info" : {
"filename" : "p4src/echo.p4", "filename" : "p4src/echo.p4",
"line" : 108, "line" : 100,
"column" : 8, "column" : 8,
"source_fragment" : "verify_checksum( ..." "source_fragment" : "verify_checksum( ..."
}, },
...@@ -461,7 +458,7 @@ ...@@ -461,7 +458,7 @@
"id" : 1, "id" : 1,
"source_info" : { "source_info" : {
"filename" : "p4src/echo.p4", "filename" : "p4src/echo.p4",
"line" : 128, "line" : 120,
"column" : 8, "column" : 8,
"source_fragment" : "update_checksum( ..." "source_fragment" : "update_checksum( ..."
}, },
...@@ -542,88 +539,81 @@ ...@@ -542,88 +539,81 @@
} }
}, },
{ {
"name" : "set_egress", "name" : "fwd_act",
"id" : 2, "id" : 2,
"runtime_data" : [], "runtime_data" : [
"primitives" : [
{ {
"op" : "prime", "name" : "port",
"parameters" : [] "bitwidth" : 16
}, }
],
"primitives" : [
{ {
"op" : "assign", "op" : "assign",
"parameters" : [ "parameters" : [
{ {
"type" : "field", "type" : "field",
"value" : ["scalars", "temp"] "value" : ["standard_metadata", "egress_spec"]
}, },
{ {
"type" : "field", "type" : "runtime_data",
"value" : ["ipv4", "dstAddr"] "value" : 0
} }
], ],
"source_info" : { "source_info" : {
"filename" : "p4src/echo.p4", "filename" : "p4src/echo.p4",
"line" : 16, "line" : 13,
"column" : 8, "column" : 8,
"source_fragment" : "bit<32> temp = hdr.ipv4.dstAddr;" "source_fragment" : "standard_metadata.egress_spec = port"
} }
}
],
"source_info" : {
"filename" : "p4src/echo.p4",
"line" : 12,
"column" : 29,
"source_fragment" : "fwd_act"
}
},
{
"name" : "dispatch_act",
"id" : 3,
"runtime_data" : [
{
"name" : "dstAddr",
"bitwidth" : 32
}, },
{ {
"op" : "assign", "name" : "dstPort",
"parameters" : [ "bitwidth" : 16
{
"type" : "field",
"value" : ["ipv4", "dstAddr"]
},
{
"type" : "field",
"value" : ["ipv4", "srcAddr"]
}
],
"source_info" : {
"filename" : "p4src/echo.p4",
"line" : 17,
"column" : 8,
"source_fragment" : "hdr.ipv4.dstAddr = hdr.ipv4.srcAddr"
}
}, },
{ {
"op" : "assign", "name" : "ethernetAddr",
"parameters" : [ "bitwidth" : 48
{
"type" : "field",
"value" : ["ipv4", "srcAddr"]
},
{
"type" : "field",
"value" : ["scalars", "temp"]
}
],
"source_info" : {
"filename" : "p4src/echo.p4",
"line" : 18,
"column" : 8,
"source_fragment" : "hdr.ipv4.srcAddr = temp"
}
}, },
{
"name" : "egress_port",
"bitwidth" : 16
}
],
"primitives" : [
{ {
"op" : "assign", "op" : "assign",
"parameters" : [ "parameters" : [
{ {
"type" : "field", "type" : "field",
"value" : ["udp", "dstPort"] "value" : ["ipv4", "dstAddr"]
}, },
{ {
"type" : "hexstr", "type" : "runtime_data",
"value" : "0x2328" "value" : 0
} }
], ],
"source_info" : { "source_info" : {
"filename" : "p4src/echo.p4", "filename" : "p4src/echo.p4",
"line" : 19, "line" : 26,
"column" : 8, "column" : 8,
"source_fragment" : "hdr.udp.dstPort = 9000" "source_fragment" : "hdr.ipv4.dstAddr = dstAddr"
} }
}, },
{ {
...@@ -631,18 +621,18 @@ ...@@ -631,18 +621,18 @@
"parameters" : [ "parameters" : [
{ {
"type" : "field", "type" : "field",
"value" : ["scalars", "tempEth"] "value" : ["udp", "dstPort"]
}, },
{ {
"type" : "field", "type" : "runtime_data",
"value" : ["ethernet", "dstAddr"] "value" : 1
} }
], ],
"source_info" : { "source_info" : {
"filename" : "p4src/echo.p4", "filename" : "p4src/echo.p4",
"line" : 20, "line" : 27,
"column" : 8, "column" : 8,
"source_fragment" : "bit<48> tempEth = hdr.ethernet.dstAddr;" "source_fragment" : "hdr.udp.dstPort = dstPort"
} }
}, },
{ {
...@@ -650,18 +640,18 @@ ...@@ -650,18 +640,18 @@
"parameters" : [ "parameters" : [
{ {
"type" : "field", "type" : "field",
"value" : ["ethernet", "dstAddr"] "value" : ["map_hdr", "data"]
}, },
{ {
"type" : "field", "type" : "hexstr",
"value" : ["ethernet", "srcAddr"] "value" : "0x00000063"
} }
], ],
"source_info" : { "source_info" : {
"filename" : "p4src/echo.p4", "filename" : "p4src/echo.p4",
"line" : 21, "line" : 28,
"column" : 8, "column" : 8,
"source_fragment" : "hdr.ethernet.dstAddr = hdr.ethernet.srcAddr" "source_fragment" : "hdr.map_hdr.data = 99"
} }
}, },
{ {
...@@ -669,18 +659,18 @@ ...@@ -669,18 +659,18 @@
"parameters" : [ "parameters" : [
{ {
"type" : "field", "type" : "field",
"value" : ["ethernet", "srcAddr"] "value" : ["ethernet", "dstAddr"]
}, },
{ {
"type" : "field", "type" : "runtime_data",
"value" : ["scalars", "tempEth"] "value" : 2
} }
], ],
"source_info" : { "source_info" : {
"filename" : "p4src/echo.p4", "filename" : "p4src/echo.p4",
"line" : 22, "line" : 29,
"column" : 8, "column" : 8,
"source_fragment" : "hdr.ethernet.srcAddr = tempEth" "source_fragment" : "hdr.ethernet.dstAddr = ethernetAddr"
} }
}, },
{ {
...@@ -697,157 +687,44 @@ ...@@ -697,157 +687,44 @@
], ],
"source_info" : { "source_info" : {
"filename" : "p4src/echo.p4", "filename" : "p4src/echo.p4",
"line" : 23, "line" : 35,
"column" : 8, "column" : 8,
"source_fragment" : "standard_metadata.egress_spec = standard_metadata.ingress_port" "source_fragment" : "standard_metadata.egress_spec = standard_metadata.ingress_port"
} }
},
{
"op" : "assign",
"parameters" : [
{
"type" : "field",
"value" : ["ipv4", "ttl"]
},
{
"type" : "expression",
"value" : {
"type" : "expression",
"value" : {
"op" : "&",
"left" : {
"type" : "expression",
"value" : {
"op" : "+",
"left" : {
"type" : "field",
"value" : ["ipv4", "ttl"]
},
"right" : {
"type" : "hexstr",
"value" : "0xff"
}
}
},
"right" : {
"type" : "hexstr",
"value" : "0xff"
}
}
}
}
],
"source_info" : {
"filename" : "p4src/echo.p4",
"line" : 24,
"column" : 8,
"source_fragment" : "hdr.ipv4.ttl = hdr.ipv4.ttl - 8w1"
}
} }
], ],
"source_info" : { "source_info" : {
"filename" : "p4src/echo.p4", "filename" : "p4src/echo.p4",
"line" : 12, "line" : 25,
"column" : 32, "column" : 34,
"source_fragment" : "set_egress" "source_fragment" : "dispatch_act"
}
},
{
"name" : "fwd_act",
"id" : 3,
"runtime_data" : [
{
"name" : "port",
"bitwidth" : 16
}
],
"primitives" : [
{
"op" : "assign",
"parameters" : [
{
"type" : "field",
"value" : ["standard_metadata", "egress_spec"]
},
{
"type" : "runtime_data",
"value" : 0
}
],
"source_info" : {
"filename" : "p4src/echo.p4",
"line" : 28,
"column" : 8,
"source_fragment" : "standard_metadata.egress_spec = port"
}
}
],
"source_info" : {
"filename" : "p4src/echo.p4",
"line" : 27,
"column" : 29,
"source_fragment" : "fwd_act"
} }
}, },
{ {
"name" : "dispatch_act", "name" : "act",
"id" : 4, "id" : 4,
"runtime_data" : [ "runtime_data" : [],
{
"name" : "dstAddr",
"bitwidth" : 32
},
{
"name" : "dstPort",
"bitwidth" : 16
}
],
"primitives" : [ "primitives" : [
{ {
"op" : "assign", "op" : "assign",
"parameters" : [ "parameters" : [
{ {
"type" : "field", "type" : "field",
"value" : ["ipv4", "dstAddr"] "value" : ["map_hdr", "data"]
}, },
{ {
"type" : "runtime_data", "type" : "hexstr",
"value" : 0 "value" : "0x00000064"
} }
], ],
"source_info" : { "source_info" : {
"filename" : "p4src/echo.p4", "filename" : "p4src/echo.p4",
"line" : 41, "line" : 52,
"column" : 8, "column" : 9,
"source_fragment" : "hdr.ipv4.dstAddr = dstAddr" "source_fragment" : "hdr.map_hdr.data = 32w100"
}
},
{
"op" : "assign",
"parameters" : [
{
"type" : "field",
"value" : ["udp", "dstPort"]
},
{
"type" : "runtime_data",
"value" : 1
}
],
"source_info" : {
"filename" : "p4src/echo.p4",
"line" : 42,
"column" : 8,
"source_fragment" : "hdr.udp.dstPort = dstPort"
} }
} }
], ]
"source_info" : {
"filename" : "p4src/echo.p4",
"line" : 40,
"column" : 34,
"source_fragment" : "dispatch_act"
}
}, },
{ {
"name" : "fix_checksum", "name" : "fix_checksum",
...@@ -868,7 +745,7 @@ ...@@ -868,7 +745,7 @@
], ],
"source_info" : { "source_info" : {
"filename" : "p4src/echo.p4", "filename" : "p4src/echo.p4",
"line" : 85, "line" : 77,
"column" : 8, "column" : 8,
"source_fragment" : "hdr.udp.checksum = 16w0" "source_fragment" : "hdr.udp.checksum = 16w0"
} }
...@@ -876,7 +753,7 @@ ...@@ -876,7 +753,7 @@
], ],
"source_info" : { "source_info" : {
"filename" : "p4src/echo.p4", "filename" : "p4src/echo.p4",
"line" : 84, "line" : 76,
"column" : 33, "column" : 33,
"source_fragment" : "fix_checksum" "source_fragment" : "fix_checksum"
} }
...@@ -895,7 +772,7 @@ ...@@ -895,7 +772,7 @@
"init_table" : "node_2", "init_table" : "node_2",
"tables" : [ "tables" : [
{ {
"name" : "tbl_set_egress", "name" : "tbl_act",
"id" : 0, "id" : 0,
"key" : [], "key" : [],
"match_type" : "exact", "match_type" : "exact",
...@@ -904,14 +781,14 @@ ...@@ -904,14 +781,14 @@
"with_counters" : false, "with_counters" : false,
"support_timeout" : false, "support_timeout" : false,
"direct_meters" : null, "direct_meters" : null,
"action_ids" : [2], "action_ids" : [4],
"actions" : ["set_egress"], "actions" : ["act"],
"base_default_next" : null, "base_default_next" : "dispatch",
"next_tables" : { "next_tables" : {
"set_egress" : null "act" : "dispatch"
}, },
"default_entry" : { "default_entry" : {
"action_id" : 2, "action_id" : 4,
"action_const" : true, "action_const" : true,
"action_data" : [], "action_data" : [],
"action_entry_const" : true "action_entry_const" : true
...@@ -922,14 +799,14 @@ ...@@ -922,14 +799,14 @@
"id" : 1, "id" : 1,
"source_info" : { "source_info" : {
"filename" : "p4src/echo.p4", "filename" : "p4src/echo.p4",
"line" : 45, "line" : 41,
"column" : 29, "column" : 29,
"source_fragment" : "dispatch" "source_fragment" : "dispatch"
}, },
"key" : [ "key" : [
{ {
"match_type" : "exact", "match_type" : "exact",
"target" : ["map_hdr", "chain_id"], "target" : ["map_hdr", "function_id"],
"mask" : null "mask" : null
} }
], ],
...@@ -939,12 +816,12 @@ ...@@ -939,12 +816,12 @@
"with_counters" : false, "with_counters" : false,
"support_timeout" : false, "support_timeout" : false,
"direct_meters" : null, "direct_meters" : null,
"action_ids" : [4, 1], "action_ids" : [3, 1],
"actions" : ["dispatch_act", "NoAction"], "actions" : ["dispatch_act", "NoAction"],
"base_default_next" : "fwd", "base_default_next" : null,
"next_tables" : { "next_tables" : {
"dispatch_act" : "fwd", "dispatch_act" : null,
"NoAction" : "fwd" "NoAction" : null
}, },
"default_entry" : { "default_entry" : {
"action_id" : 1, "action_id" : 1,
...@@ -958,7 +835,7 @@ ...@@ -958,7 +835,7 @@
"id" : 2, "id" : 2,
"source_info" : { "source_info" : {
"filename" : "p4src/echo.p4", "filename" : "p4src/echo.p4",
"line" : 31, "line" : 16,
"column" : 24, "column" : 24,
"source_fragment" : "fwd" "source_fragment" : "fwd"
}, },
...@@ -975,7 +852,7 @@ ...@@ -975,7 +852,7 @@
"with_counters" : false, "with_counters" : false,
"support_timeout" : false, "support_timeout" : false,
"direct_meters" : null, "direct_meters" : null,
"action_ids" : [3, 0], "action_ids" : [2, 0],
"actions" : ["fwd_act", "NoAction"], "actions" : ["fwd_act", "NoAction"],
"base_default_next" : null, "base_default_next" : null,
"next_tables" : { "next_tables" : {
...@@ -997,9 +874,9 @@ ...@@ -997,9 +874,9 @@
"id" : 0, "id" : 0,
"source_info" : { "source_info" : {
"filename" : "p4src/echo.p4", "filename" : "p4src/echo.p4",
"line" : 55, "line" : 51,
"column" : 12, "column" : 12,
"source_fragment" : "hdr.ipv4.isValid() && hdr.udp.dstPort == 8889" "source_fragment" : "hdr.ipv4.isValid() && hdr.udp.dstPort == 8000"
}, },
"expression" : { "expression" : {
"type" : "expression", "type" : "expression",
...@@ -1026,56 +903,13 @@ ...@@ -1026,56 +903,13 @@
}, },
"right" : { "right" : {
"type" : "hexstr", "type" : "hexstr",
"value" : "0x22b9" "value" : "0x1f40"
} }
} }
} }
} }
}, },
"true_next" : "tbl_set_egress", "true_next" : "tbl_act",
"false_next" : "node_4"
},
{
"name" : "node_4",
"id" : 1,
"source_info" : {
"filename" : "p4src/echo.p4",
"line" : 60,
"column" : 16,
"source_fragment" : "hdr.ipv4.isValid() && hdr.udp.dstPort == 8080"
},
"expression" : {
"type" : "expression",
"value" : {
"op" : "and",
"left" : {
"type" : "expression",
"value" : {
"op" : "d2b",
"left" : null,
"right" : {
"type" : "field",
"value" : ["ipv4", "$valid$"]
}
}
},
"right" : {
"type" : "expression",
"value" : {
"op" : "==",
"left" : {
"type" : "field",
"value" : ["udp", "dstPort"]
},
"right" : {
"type" : "hexstr",
"value" : "0x1f90"
}
}
}
}
},
"true_next" : "dispatch",
"false_next" : "fwd" "false_next" : "fwd"
} }
] ]
...@@ -1085,7 +919,7 @@ ...@@ -1085,7 +919,7 @@
"id" : 1, "id" : 1,
"source_info" : { "source_info" : {
"filename" : "p4src/echo.p4", "filename" : "p4src/echo.p4",
"line" : 69, "line" : 61,
"column" : 8, "column" : 8,
"source_fragment" : "egress" "source_fragment" : "egress"
}, },
...@@ -1161,29 +995,7 @@ ...@@ -1161,29 +995,7 @@
], ],
"force_arith" : [], "force_arith" : [],
"extern_instances" : [], "extern_instances" : [],
"extern_function_instances" : [ "extern_function_instances" : [],
{
"name" : "prime",
"id" : 0,
"source_info" : {
"filename" : "p4src/echo.p4",
"line" : 8,
"column" : 12,
"source_fragment" : "prime"
}
}
],
"field_aliases" : [], "field_aliases" : [],
"flow_variables" : [ "flow_variables" : []
{
"flow" : "ingress",
"header" : "scalars",
"field" : "temp"
},
{
"flow" : "ingress",
"header" : "scalars",
"field" : "tempEth"
}
]
} }
\ No newline at end of file
...@@ -8,21 +8,6 @@ ...@@ -8,21 +8,6 @@
extern void prime(); extern void prime();
control ingress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { control ingress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) {
@name(".set_egress") action set_egress() {
prime();
bit<32> temp = hdr.ipv4.dstAddr;
hdr.ipv4.dstAddr = hdr.ipv4.srcAddr;
hdr.ipv4.srcAddr = temp;
hdr.udp.dstPort = 9000;
bit<48> tempEth = hdr.ethernet.dstAddr;
hdr.ethernet.dstAddr = hdr.ethernet.srcAddr;
hdr.ethernet.srcAddr = tempEth;
standard_metadata.egress_spec = standard_metadata.ingress_port;
hdr.ipv4.ttl = hdr.ipv4.ttl - 8w1;
}
@name(".fwd_act") action fwd_act(bit<16> port) { @name(".fwd_act") action fwd_act(bit<16> port) {
standard_metadata.egress_spec = port; standard_metadata.egress_spec = port;
...@@ -37,9 +22,20 @@ control ingress(inout headers hdr, inout metadata meta, inout standard_metadata_ ...@@ -37,9 +22,20 @@ control ingress(inout headers hdr, inout metadata meta, inout standard_metadata_
} }
} }
@name(".dispatch_act") action dispatch_act(bit<32> dstAddr, bit<16> dstPort) { @name(".dispatch_act") action dispatch_act(bit<32> dstAddr, bit<16> dstPort, bit<48> ethernetAddr , bit<16> egress_port) {
hdr.ipv4.dstAddr = dstAddr; hdr.ipv4.dstAddr = dstAddr;
hdr.udp.dstPort = dstPort; hdr.udp.dstPort = dstPort;
hdr.map_hdr.data = 99;
hdr.ethernet.dstAddr = ethernetAddr;
// standard_metadata.egress_port = egress_port;
// bit<48> tempEth = hdr.ethernet.dstAddr;
// hdr.ethernet.dstAddr = hdr.ethernet.srcAddr;
// hdr.ethernet.srcAddr = tempEth;
standard_metadata.egress_spec = standard_metadata.ingress_port;
// hdr.ipv4.ttl = hdr.ipv4.ttl - 8w1;
} }
@name(".dispatch") table dispatch { @name(".dispatch") table dispatch {
...@@ -47,22 +43,18 @@ control ingress(inout headers hdr, inout metadata meta, inout standard_metadata_ ...@@ -47,22 +43,18 @@ control ingress(inout headers hdr, inout metadata meta, inout standard_metadata_
dispatch_act; dispatch_act;
} }
key = { key = {
hdr.map_hdr.chain_id : exact; hdr.map_hdr.function_id : exact;
} }
} }
apply { apply {
if (hdr.ipv4.isValid() && hdr.udp.dstPort == MDS_PORT) { if (hdr.ipv4.isValid() && hdr.udp.dstPort == DISPATCHER_PORT) {
// hdr.map_hdr.data = 32w100; hdr.map_hdr.data = 32w100;
dispatch.apply();
set_egress(); // fwd.apply();
} else { } else {
if (hdr.ipv4.isValid() && hdr.udp.dstPort == 8080) {
dispatch.apply();
}
fwd.apply(); fwd.apply();
} }
//fwd.apply();
} }
} }
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
"matchFields": [ "matchFields": [
{ {
"id": 1, "id": 1,
"name": "map_hdr.chain_id", "name": "map_hdr.function_id",
"bitwidth": 32, "bitwidth": 32,
"matchType": "EXACT" "matchType": "EXACT"
} }
...@@ -63,13 +63,6 @@ ...@@ -63,13 +63,6 @@
"alias": "NoAction" "alias": "NoAction"
} }
}, },
{
"preamble": {
"id": 16816129,
"name": "set_egress",
"alias": "set_egress"
}
},
{ {
"preamble": { "preamble": {
"id": 16805069, "id": 16805069,
...@@ -100,6 +93,16 @@ ...@@ -100,6 +93,16 @@
"id": 2, "id": 2,
"name": "dstPort", "name": "dstPort",
"bitwidth": 16 "bitwidth": 16
},
{
"id": 3,
"name": "ethernetAddr",
"bitwidth": 48
},
{
"id": 4,
"name": "egress_port",
"bitwidth": 16
} }
] ]
}, },
......
...@@ -33,12 +33,6 @@ ing_metadata: ...@@ -33,12 +33,6 @@ ing_metadata:
- _padding: 2 - _padding: 2
type: metadata type: metadata
ingress::set_egress::scalars:
fields:
- temp: 32
- tempEth: 48
type: metadata
ipv4: ipv4:
calculated_fields: calculated_fields:
- condition: valid(ipv4) - condition: valid(ipv4)
...@@ -68,7 +62,7 @@ map_hdr: ...@@ -68,7 +62,7 @@ map_hdr:
fields: fields:
- chain_id: 32 - chain_id: 32
- exec_id: 32 - exec_id: 32
- function_id: 8 - function_id: 32
- data: 32 - data: 32
- function_count: 8 - function_count: 8
- f0: 8 - f0: 8
...@@ -214,7 +208,7 @@ parser: ...@@ -214,7 +208,7 @@ parser:
start -> exit [value="default", mask="none", order="1"] start -> exit [value="default", mask="none", order="1"]
parse_ipv4 -> parse_udp [value="0x00000511", mask="0x00000fff", order="0"] parse_ipv4 -> parse_udp [value="0x00000511", mask="0x00000fff", order="0"]
parse_ipv4 -> exit [value="default", mask="none", order="1"] parse_ipv4 -> exit [value="default", mask="none", order="1"]
parse_udp -> parse_map_hdr [value="0x22b9", mask="none", order="0"] parse_udp -> parse_map_hdr [value="0x1f40", mask="none", order="0"]
parse_udp -> parse_map_hdr [value="0x2328", mask="none", order="1"] parse_udp -> parse_map_hdr [value="0x2328", mask="none", order="1"]
parse_udp -> exit [value="default", mask="none", order="2"] parse_udp -> exit [value="default", mask="none", order="2"]
parse_map_hdr -> exit [value="default", mask="none", order="0"] parse_map_hdr -> exit [value="default", mask="none", order="0"]
...@@ -223,25 +217,6 @@ parser: ...@@ -223,25 +217,6 @@ parser:
type: parser type: parser
##########################################
# External functions #
##########################################
prime__0:
name: prime
type: external_action
##########################################
# Action Expressions #
##########################################
_expression_set_egress_0:
expression: ((((ipv4.ttl) + (0xff))) & (0xff))
format: bracketed_expr
type: expression
########################################## ##########################################
# Action sets # # Action sets #
########################################## ##########################################
...@@ -249,18 +224,29 @@ _expression_set_egress_0: ...@@ -249,18 +224,29 @@ _expression_set_egress_0:
egress::fix_checksum: egress::fix_checksum:
implementation: modify_field(udp.checksum, 0x0000); implementation: modify_field(udp.checksum, 0x0000);
src_filename: p4src/echo.p4 src_filename: p4src/echo.p4
src_lineno: 84 src_lineno: 76
type: action
ingress::act:
implementation: modify_field(map_hdr.data, 0x00000064);
src_filename: ''
src_lineno: 1
type: action type: action
ingress::dispatch_act: ingress::dispatch_act:
implementation: |- implementation: |-
modify_field(ipv4.dstAddr, dstAddr); modify_field(ipv4.dstAddr, dstAddr);
modify_field(udp.dstPort, dstPort); modify_field(udp.dstPort, dstPort);
modify_field(map_hdr.data, 0x00000063);
modify_field(ethernet.dstAddr, ethernetAddr);
modify_field(standard_metadata.egress_spec, standard_metadata.ingress_port);
parameter_list: parameter_list:
- dstAddr: 32 - dstAddr: 32
- dstPort: 16 - dstPort: 16
- ethernetAddr: 48
- egress_port: 16
src_filename: p4src/echo.p4 src_filename: p4src/echo.p4
src_lineno: 40 src_lineno: 25
type: action type: action
ingress::fwd_act: ingress::fwd_act:
...@@ -268,22 +254,6 @@ ingress::fwd_act: ...@@ -268,22 +254,6 @@ ingress::fwd_act:
parameter_list: parameter_list:
- port: 16 - port: 16
src_filename: p4src/echo.p4 src_filename: p4src/echo.p4
src_lineno: 27
type: action
ingress::set_egress:
implementation: |-
prime();
modify_field(ingress::set_egress::scalars.temp, ipv4.dstAddr);
modify_field(ipv4.dstAddr, ipv4.srcAddr);
modify_field(ipv4.srcAddr, ingress::set_egress::scalars.temp);
modify_field(udp.dstPort, 0x2328);
modify_field(ingress::set_egress::scalars.tempEth, ethernet.dstAddr);
modify_field(ethernet.dstAddr, ethernet.srcAddr);
modify_field(ethernet.srcAddr, ingress::set_egress::scalars.tempEth);
modify_field(standard_metadata.egress_spec, standard_metadata.ingress_port);
modify_field(ipv4.ttl, _expression_set_egress_0);
src_filename: p4src/echo.p4
src_lineno: 12 src_lineno: 12
type: action type: action
...@@ -307,10 +277,10 @@ ingress::dispatch: ...@@ -307,10 +277,10 @@ ingress::dispatch:
allowed_actions: allowed_actions:
- ingress::dispatch_act - ingress::dispatch_act
match_on: match_on:
map_hdr.chain_id: exact map_hdr.function_id: exact
max_entries: 1025 max_entries: 1025
src_filename: p4src/echo.p4 src_filename: p4src/echo.p4
src_lineno: 45 src_lineno: 41
type: table type: table
ingress::fwd: ingress::fwd:
...@@ -320,14 +290,14 @@ ingress::fwd: ...@@ -320,14 +290,14 @@ ingress::fwd:
standard_metadata.ingress_port: exact standard_metadata.ingress_port: exact
max_entries: 1025 max_entries: 1025
src_filename: p4src/echo.p4 src_filename: p4src/echo.p4
src_lineno: 31 src_lineno: 16
type: table type: table
ingress::tbl_set_egress: ingress::tbl_act:
allowed_actions: allowed_actions:
- ingress::set_egress - ingress::act
default_entry: default_entry:
action: ingress::set_egress action: ingress::act
const: true const: true
max_entries: 1025 max_entries: 1025
src_filename: '' src_filename: ''
...@@ -340,17 +310,10 @@ ingress::tbl_set_egress: ...@@ -340,17 +310,10 @@ ingress::tbl_set_egress:
########################################## ##########################################
_condition_0: _condition_0:
condition: (((valid(ipv4))) and (((udp.dstPort) == (8889)))) condition: (((valid(ipv4))) and (((udp.dstPort) == (8000))))
format: bracketed_expr
src_filename: p4src/echo.p4
src_lineno: 55
type: conditional
_condition_1:
condition: (((valid(ipv4))) and (((udp.dstPort) == (8080))))
format: bracketed_expr format: bracketed_expr
src_filename: p4src/echo.p4 src_filename: p4src/echo.p4
src_lineno: 60 src_lineno: 51
type: conditional type: conditional
...@@ -363,13 +326,11 @@ ingress_flow: ...@@ -363,13 +326,11 @@ ingress_flow:
format: dot format: dot
implementation: |- implementation: |-
digraph { digraph {
"_condition_0" -> "_condition_1" [condition = false] "_condition_0" -> "ingress::fwd" [condition = false]
"_condition_0" -> "ingress::tbl_set_egress" [condition = true] "_condition_0" -> "ingress::tbl_act" [condition = true]
"_condition_1" -> "ingress::fwd" [condition = false]
"_condition_1" -> "ingress::dispatch" [condition = true]
"ingress::fwd" -> "exit_control_flow" [action = always] "ingress::fwd" -> "exit_control_flow" [action = always]
"ingress::dispatch" -> "ingress::fwd" [action = always] "ingress::tbl_act" -> "ingress::dispatch" [action = always]
"ingress::tbl_set_egress" -> "exit_control_flow" [action = always] "ingress::dispatch" -> "exit_control_flow" [action = always]
} }
start_state: _condition_0 start_state: _condition_0
type: control_flow type: control_flow
...@@ -421,7 +382,7 @@ layout: ...@@ -421,7 +382,7 @@ layout:
########################################## ##########################################
source_info: source_info:
date: 2021/02/22 11:12:59 date: 2021/03/01 20:59:20
output_file: p4src/echo.yml output_file: p4src/echo.yml
p4_version: '16' p4_version: '16'
source_files: source_files:
......
#define REPLY_PORT 9000 #define REPLY_PORT 9000
#define MDS_PORT 8889 #define DISPATCHER_PORT 8000
#define NUM_CACHE 128 #define NUM_CACHE 128
#define CLUSTER_COUNT 2 #define CLUSTER_COUNT 2
#define DEAD_EGRESS_PORT 9 #define DEAD_EGRESS_PORT 9
......
...@@ -43,7 +43,7 @@ header udp_t { ...@@ -43,7 +43,7 @@ header udp_t {
header map_hdr_t { header map_hdr_t {
bit<32> chain_id; bit<32> chain_id;
bit<32> exec_id; bit<32> exec_id;
bit<8> function_id; bit<32> function_id;
bit<32> data; bit<32> data;
bit<8> function_count; bit<8> function_count;
bit<8> f0; bit<8> f0;
......
...@@ -11,7 +11,7 @@ parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout ...@@ -11,7 +11,7 @@ parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout
@name(".parse_udp") state parse_udp { @name(".parse_udp") state parse_udp {
packet.extract<udp_t>(hdr.udp); packet.extract<udp_t>(hdr.udp);
transition select(hdr.udp.dstPort) { transition select(hdr.udp.dstPort) {
MDS_PORT: parse_map_hdr; DISPATCHER_PORT: parse_map_hdr;
REPLY_PORT: parse_map_hdr; REPLY_PORT: parse_map_hdr;
default: accept; default: accept;
} }
......
import socket
import struct
import time
import thread
import argparse
NC_PORT = 8000
parser = argparse.ArgumentParser(description='Mininet demo')
parser.add_argument('--client-ip', help='IP of client',
type=str, action="store", required=True)
args = parser.parse_args()
CLIENT_IP = args.client_ip
# CLIENT_IP = "192.168.0.105"
len_key = 16
counter = 0
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((CLIENT_IP, NC_PORT))
while True:
packet, addr = s.recvfrom(1024)
# print packet
counter = counter + 1
base = 0
chain_id = struct.unpack(">I", packet[base:base + 4])[0]
base += 4
exec_id = struct.unpack(">I", packet[base:base + 4])[0]
base += 4
function_id = struct.unpack(">I", packet[base:base + 4])[0]
base += 1
data = struct.unpack(">I", packet[base:base + 4])[0]
base += 4
function_count = struct.unpack("B", packet[base])[0]
print chain_id, exec_id, data, "function_id", function_id, function_count
data = []
for i in range(1, 6):
data.append(int(struct.unpack("B", packet[i+base])[0]))
print data
\ No newline at end of file
import socket
import struct
import time
import threading
import random
import time
import argparse
parser = argparse.ArgumentParser(description='Mininet demo')
parser.add_argument('--client-port', help='Port of client',
type=int, action="store", required=True)
parser.add_argument('--send-data', help='Data to send',
type=int, action="store", required=False)
parser.add_argument('--fid', help='Funtion id',
type=int, action="store", required=False)
parser.add_argument('--closed', help='Closed loop',
type=int, action="store", required=True)
group = parser.add_mutually_exclusive_group(required=True)
# group.add_argument('--bandwidth', help='Bandwidth',
# type=int, action="store")
group.add_argument('--rps', help='Requests per second',
type=int, action="store")
group.add_argument('--req-count', help='Number of requests to send',
type=int, action="store")
parser.add_argument('--offload', help='offload a portion of workloads',
type=float, action="store")
args = parser.parse_args()
print args.send_data
PORT = args.client_port
dataInt = args.send_data
fid = args.fid
SERVER_IP = "192.168.2.2"
egress_time = []
ingress_time = []
stop_thread = False
def receive():
global egress_time, stop_thread
CLIENT_IP = "0.0.0.0"
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((CLIENT_IP, 7070))
print "listening to {} at port {}".format(CLIENT_IP, 9000)
run_status = {}
while True:
if stop_thread:
break
packet, addr = s.recvfrom(1024)
# print packet
base = 0
chain_id = struct.unpack(">I", packet[base:base + 4])[0]
base += 4
exec_id = struct.unpack(">I", packet[base:base + 4])[0]
base += 4
function_id = struct.unpack(">I", packet[base:base + 4])[0]
base += 1
data = struct.unpack(">I", packet[base:base + 4])[0]
base += 4
function_count = struct.unpack("B", packet[base])[0]
print "rec", chain_id, exec_id, data, function_id, function_count
def genPacket():
global fid
packet = None
exec_id = random.randint(0, 16384)
chain_id = 1
# data = 100
function_count = 5
function_id = fid if (fid) else 0
f0 = 0
f1 = 0
f2 = 2
f3 = 6
f4 = 2
print chain_id, exec_id, "function_id", function_id, function_count, \
f0, f1, f2, f3, f4
offload_status = False
chain_id = struct.pack(">I", chain_id) # chain id
exec_id = struct.pack(">I", exec_id) # execution id
if args.offload is not None:
max_workload = 100
dataInt = random.randint(1, max_workload)
cutoff = max_workload * args.offload
if dataInt <= cutoff:
data = struct.pack(">I", dataInt * 256) # data
offload_status = True
else:
data = struct.pack(">I", dataInt) # data
else:
data = struct.pack(">I", dataInt) # data
# print "{0:b}".format(data)
function_count = struct.pack("B", function_count) # function count
function_id = struct.pack(">I", function_id) # function count
f0 = struct.pack("B", f0) # f0
f1 = struct.pack("B", f1) # f1
f2 = struct.pack("B", f2) # f2 -> f0
f3 = struct.pack("B", f3) # f3 -> f1 f2
f4 = struct.pack("B", f4) # f4 -> f3
packet = chain_id + exec_id + function_id + data + function_count + \
f0 + f1 + f2 + f3 + f4
# print dataInt, offload_status
return packet, offload_status
def sendThread(start_time, runtime, sleep_time, s):
global ingress_time
while True:
packet, offload_status = genPacket()
if time.time() - start_time > runtime:
break
s.sendto(packet, (SERVER_IP, PORT))
ingress_time.append(time.time())
time.sleep(sleep_time)
def send():
global egress_time, ingress_time
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
print "Sending packet to %s at port %s" % (SERVER_IP, PORT)
print "chain id, exec id, data, function count, functions dependencies..."
# op = struct.unpack("B", packet[0])
packet, _ = genPacket()
if args.req_count is not None:
for i in range(args.req_count):
s.sendto(packet, (SERVER_IP, PORT))
ingress_time.append(time.time())
# print "%.20f" % time.time()
# time.sleep(2)
# break
elif args.offload is None and args.rps is not None:
runtime = 10
start_time = time.time()
sleep_time = 1 / float(args.rps)
print "calculated inter-arrival time", sleep_time
while True:
if time.time() - start_time > runtime:
break
s.sendto(packet, (SERVER_IP, PORT))
ingress_time.append(time.time())
time.sleep(sleep_time)
elif args.offload is not None:
runtime = 10
thread_count = 8
start_time = time.time()
sleep_time = 1 / float(args.rps) * thread_count
print "calculated inter-arrival time, offload mode", sleep_time
for i in range(thread_count):
t = threading.Thread(target=sendThread, args=[
start_time, runtime, sleep_time, s])
t.daemon = True
t.start()
time.sleep(runtime)
stop_thread = True
# s.sendto(packet, (SERVER_IP, PORT))
# r.join()
# r.join()
if args.closed == 1:
r = threading.Thread(name="receive", target=receive)
r.daemon = True
r.start()
time.sleep(1)
send()
python2 send.py --client-port 8000 --closed 1 --offload 0 --rps 1 --send-data 0 --closed 1 --fid 1
\ No newline at end of file
#! /bin/bash -ex
start_docker=0
copy_send=0
location=$(pwd)
while getopts 'sc' flag; do
case "${flag}" in
s) start_docker=1 ;;
c) copy_send=1 ;;
i) assign_ip_flag=1 ;;
esac
done
if [[ $start_docker -eq 1 ]]
then
# start python docker container
docker run --rm -dit --net pub_net --name send python
fi
if [[ $copy_send -eq 1 ]]
then
# start python docker container
docker cp send.py send:/
docker cp send.sh send:/
fi
docker exec -it send /bin/bash
\ No newline at end of file
...@@ -15,6 +15,24 @@ actions = '''{ "type" : "ingress::dispatch_act", ...@@ -15,6 +15,24 @@ actions = '''{ "type" : "ingress::dispatch_act",
"dstPort" : { "value" : "%d" } } }''' % ("192.168.2.2", 8080) "dstPort" : { "value" : "%d" } } }''' % ("192.168.2.2", 8080)
print actions print actions
# RTEInterface.Tables.AddRule(tableId, rule_name, default_rule, actions) # RTEInterface.Tables.AddRule(tableId, rule_name, default_rule, actions)
default_rule = False
ip = "192.168.2.4"
port = 7070
actions = '''{
"type" : "ingress::dispatch_act",
"data" : {
"dstAddr" : { "value" : "%s" },
"dstPort" : { "value" : "%d" } ,
"egress_port": { "value": "v0.1" },
"ethernetAddr": { "value": "02:42:c0:a8:02:04" }
}
}''' % (ip, \
int(port))
print actions
# % (data.param3)
match = '{ "map_hdr.function_id" : { "value" : %d} } ' % (1)
print match
RTEInterface.Tables.AddRule(tableId, rule_name, default_rule, match, actions)
ruleList = RTEInterface.Tables.ListRules(tableId) ruleList = RTEInterface.Tables.ListRules(tableId)
print ruleList print ruleList
...@@ -28,7 +46,9 @@ for msg in consumer: ...@@ -28,7 +46,9 @@ for msg in consumer:
print worker, worker[u'node_id'] print worker, worker[u'node_id']
print str(worker[u'node_id']).strip() print str(worker[u'node_id']).strip()
print int(worker[u'portExternal']) print int(worker[u'portExternal'])
functionHash = worker[u'functionHash']
functionHash = int(functionHash[0:5], 16)
print functionHash
default_rule = False default_rule = False
actions = '''{ "type" : "ingress::dispatch_act", actions = '''{ "type" : "ingress::dispatch_act",
"data" : { "dstAddr" : { "value" : "%s" }, "data" : { "dstAddr" : { "value" : "%s" },
...@@ -36,10 +56,29 @@ for msg in consumer: ...@@ -36,10 +56,29 @@ for msg in consumer:
int(worker[u'portExternal'])) int(worker[u'portExternal']))
print actions print actions
# % (data.param3) # % (data.param3)
match = '{ "map_hdr.chain_id" : { "value" : "0"} } ' match = '{ "map_hdr.function_id" : { "value" : %d} } ' % (0)
print match
RTEInterface.Tables.AddRule(tableId, rule_name, default_rule, match, actions) RTEInterface.Tables.AddRule(tableId, rule_name, default_rule, match, actions)
ruleList = RTEInterface.Tables.ListRules(tableId) ruleList = RTEInterface.Tables.ListRules(tableId)
print ruleList print ruleList
elif msg.topic == "removeWorker": elif msg.topic == "removeWorker":
# msg = msg.value.decode('utf-8')
# # worker = str(msg.value)
# # worker = ast.literal_eval(json.dumps(worker))
# worker = json.loads(msg)
# print worker, worker[u'node_id']
# print str(worker[u'node_id']).strip()
# print int(worker[u'portExternal'])
# default_rule = False
# actions = '''{ "type" : "ingress::dispatch_act",
# "data" : { "dstAddr" : { "value" : "%s" },
# "dstPort" : { "value" : "%d" } } }''' % (str(worker[u'node_id']).strip(), \
# int(worker[u'portExternal']))
# print actions
# # % (data.param3)
# match = '{ "map_hdr.chain_id" : { "value" : "0"} } '
# RTEInterface.Tables.AddRule(tableId, rule_name, default_rule, match, actions)
# ruleList = RTEInterface.Tables.ListRules(tableId)
print ruleList
...@@ -2,9 +2,6 @@ ...@@ -2,9 +2,6 @@
"folders": [ "folders": [
{ {
"path": "../.." "path": "../.."
},
{
"path": "../../../../test/offload"
} }
], ],
"settings": {} "settings": {}
......
const struct = require('./jspack/jspack') const struct = require('./jspack/jspack')
f0 = 0; f1 = 0; f2 = 2; f3 = 6; f4 = 2 function unpackPacket(packet) {
a = [] // let buffer = new Array(1024)
chain_id = struct.PackTo(">I", chain_id) let chain_id = null; exec_id = null, function_count = null, function_id = null
exec_id = struct.PackTo(">I", exec_id) let base = 0
chain_id = struct.Unpack(">I", packet, base)
base += 4
exec_id = struct.Unpack(">I", packet, base)
base += 4
function_id = struct.Unpack("B", packet, base)
base += 1
data = struct.Unpack(">I", packet, base)
base += 4
function_count = struct.Unpack("B", packet, base)
dataInt = random.randint(1, 1000) console.log("chain_id", chain_id, "exec_id", exec_id, "data", data, "function_count", function_count, "function_id", function_id)
data = struct.PackTo(">I", dataInt) }
\ No newline at end of file
function_count = struct.PackTo("B", function_count)
function_id = struct.PackTo("B", function_id)
f0 = struct.PackTo("B", f0)
f1 = struct.PackTo("B", f1)
f2 = struct.PackTo("B", f2)
f3 = struct.PackTo("B", f3)
f4 = struct.PackTo("B", f4)
base = 0
// chain_id = struct.unpack(">I", )
// base += 4
// exec_id = struct.unpack(">I", packet[base: base + 4])[0]
// base += 4
// function_id = struct.unpack("B", packet[base])[0]
// base += 1
// data = struct.unpack(">I", packet[base: base + 4])[0]
base += 4
\ No newline at end of file
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
"express-fileupload": "^1.1.6", "express-fileupload": "^1.1.6",
"heap": "^0.2.6", "heap": "^0.2.6",
"isolated-vm": "^3.0.0", "isolated-vm": "^3.0.0",
"jspack": "^0.0.4",
"kafka-logger": "^7.1.0", "kafka-logger": "^7.1.0",
"kafka-node": "^5.0.0", "kafka-node": "^5.0.0",
"morgan": "^1.9.1", "morgan": "^1.9.1",
......
...@@ -9,6 +9,9 @@ const { spawnSync, execSync } = require('child_process'); ...@@ -9,6 +9,9 @@ const { spawnSync, execSync } = require('child_process');
// const { logger } = require('../../lib'); // const { logger } = require('../../lib');
const server = dgram.createSocket('udp4'); const server = dgram.createSocket('udp4');
const udpProxy = dgram.createSocket('udp4'); const udpProxy = dgram.createSocket('udp4');
let struct = require('jspack')
struct = struct.jspack
const app = express() const app = express()
let port = 5000, resource_id, functionHash, runtime, idleTime = 600, flagFirstRequest = true let port = 5000, resource_id, functionHash, runtime, idleTime = 600, flagFirstRequest = true
...@@ -125,14 +128,14 @@ server.on('error', (err) => { ...@@ -125,14 +128,14 @@ server.on('error', (err) => {
}); });
server.on('message', (msg, rinfo) => { server.on('message', (msg, rinfo) => {
console.log("message", msg) // console.log("message", msg)
let payload = {} let payload = unpackPacket(msg)
// console.log(payload, typeof payload); console.log(payload, typeof payload);
lastRequest = Date.now() lastRequest = Date.now()
totalRequest++ totalRequest++
executor(payload).then(result => { executor(payload).then(result => {
result = "" result = packPacket(payload)
console.log(result)
try { try {
udpProxy.send(result, 0, result.length, "8080", "192.168.2.2", function (err, bytes) { udpProxy.send(result, 0, result.length, "8080", "192.168.2.2", function (err, bytes) {
if (err) if (err)
...@@ -146,6 +149,50 @@ server.on('message', (msg, rinfo) => { ...@@ -146,6 +149,50 @@ server.on('message', (msg, rinfo) => {
}) })
}); });
function unpackPacket(packet) {
// let buffer = new Array(1024)
let chain_id = null, exec_id = null, function_count = null, function_id = null, data = null
let base = 0
chain_id = struct.Unpack(">I", packet, base)
base += 4
exec_id = struct.Unpack(">I", packet, base)
base += 4
function_id = struct.Unpack(">I", packet, base)
base += 1
data = struct.Unpack(">I", packet, base)
base += 4
function_count = struct.Unpack("B", packet, base)
console.log("chain_id", chain_id, "exec_id", exec_id, "data", data, "function_count", function_count, "function_id", function_id)
return {
chain_id: chain_id[0],
exec_id: exec_id[0],
data: data[0],
function_count: function_count[0],
function_id: function_id[0]
}
}
function packPacket(dataPacket) {
let message = new Array(1024)
let base = 0, chain_id, exec_id, function_id, data, function_count
chain_id = struct.PackTo(">I", message, base, [dataPacket.chain_id])
base += 4
exec_id = struct.PackTo(">I", message, base, [dataPacket.exec_id])
base += 4
function_id = struct.PackTo(">I", message, base, [dataPacket.function_id])
base += 1
data = struct.PackTo(">I", message, base, [dataPacket.data])
base += 4
function_count = struct.PackTo("B", message, base, [dataPacket.function_count])
message = Buffer.from(message)
return message
}
server.on('listening', () => { server.on('listening', () => {
const address = server.address(); const address = server.address();
console.log(`server listening ${address.address}:${address.port}`); console.log(`server listening ${address.address}:${address.port}`);
......
{ {
"name": "worker_env", "name": "worker_env",
"version": "1.0.0", "version": "1.0.0",
"lockfileVersion": 1, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": {
"": {
"version": "1.0.0",
"license": "ISC",
"dependencies": {
"body-parser": "^1.19.0",
"express": "^4.17.1",
"jspack": "^0.0.4",
"kafka-node": "^5.0.0",
"morgan": "^1.9.1",
"request": "^2.88.2"
}
},
"node_modules/accepts": {
"version": "1.3.7",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
"integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
"dependencies": {
"mime-types": "~2.1.24",
"negotiator": "0.6.2"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/ajv": {
"version": "6.12.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz",
"integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==",
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
}
},
"node_modules/ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
"optional": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/aproba": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
"integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
"optional": true
},
"node_modules/are-we-there-yet": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
"integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
"optional": true,
"dependencies": {
"delegates": "^1.0.0",
"readable-stream": "^2.0.6"
}
},
"node_modules/array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
},
"node_modules/asn1": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
"integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
"dependencies": {
"safer-buffer": "~2.1.0"
}
},
"node_modules/assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
"engines": {
"node": ">=0.8"
}
},
"node_modules/async": {
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
"integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
"dependencies": {
"lodash": "^4.17.14"
}
},
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
},
"node_modules/aws-sign2": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
"integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
"engines": {
"node": "*"
}
},
"node_modules/aws4": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz",
"integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug=="
},
"node_modules/balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
},
"node_modules/basic-auth": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
"integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
"dependencies": {
"safe-buffer": "5.1.2"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/bcrypt-pbkdf": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
"integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
"dependencies": {
"tweetnacl": "^0.14.3"
}
},
"node_modules/binary": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz",
"integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=",
"dependencies": {
"buffers": "~0.1.1",
"chainsaw": "~0.1.0"
}
},
"node_modules/bindings": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
"integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
"optional": true,
"dependencies": {
"file-uri-to-path": "1.0.0"
}
},
"node_modules/bl": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/bl/-/bl-2.2.0.tgz",
"integrity": "sha512-wbgvOpqopSr7uq6fJrLH8EsvYMJf9gzfo2jCsL2eTy75qXPukA4pCgHamOQkZtY5vmfVtjB+P3LNlMHW5CEZXA==",
"dependencies": {
"readable-stream": "^2.3.5",
"safe-buffer": "^5.1.1"
}
},
"node_modules/body-parser": {
"version": "1.19.0",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
"integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
"dependencies": {
"bytes": "3.1.0",
"content-type": "~1.0.4",
"debug": "2.6.9",
"depd": "~1.1.2",
"http-errors": "1.7.2",
"iconv-lite": "0.4.24",
"on-finished": "~2.3.0",
"qs": "6.7.0",
"raw-body": "2.4.0",
"type-is": "~1.6.17"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"node_modules/buffer-crc32": {
"version": "0.2.13",
"resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
"integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
"engines": {
"node": "*"
}
},
"node_modules/buffermaker": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/buffermaker/-/buffermaker-1.2.1.tgz",
"integrity": "sha512-IdnyU2jDHU65U63JuVQNTHiWjPRH0CS3aYd/WPaEwyX84rFdukhOduAVb1jwUScmb5X0JWPw8NZOrhoLMiyAHQ==",
"dependencies": {
"long": "1.1.2"
}
},
"node_modules/buffers": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz",
"integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=",
"engines": {
"node": ">=0.2.0"
}
},
"node_modules/bytes": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
"integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
},
"node_modules/chainsaw": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz",
"integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=",
"dependencies": {
"traverse": ">=0.3.0 <0.4"
}
},
"node_modules/chownr": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
"integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
"optional": true
},
"node_modules/code-point-at": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
"optional": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"dependencies": {
"delayed-stream": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
},
"node_modules/console-control-strings": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
"integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
"optional": true
},
"node_modules/content-disposition": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
"integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
"dependencies": {
"safe-buffer": "5.1.2"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/content-type": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/cookie": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
"integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/cookie-signature": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
},
"node_modules/core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
"node_modules/dashdash": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
"integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
"dependencies": {
"assert-plus": "^1.0.0"
},
"engines": {
"node": ">=0.10"
}
},
"node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/decompress-response": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz",
"integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==",
"optional": true,
"dependencies": {
"mimic-response": "^2.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/deep-extend": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
"optional": true,
"engines": {
"node": ">=4.0.0"
}
},
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/delegates": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
"optional": true
},
"node_modules/denque": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz",
"integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==",
"engines": {
"node": ">=0.10"
}
},
"node_modules/depd": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
"integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/destroy": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
},
"node_modules/detect-libc": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
"integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
"optional": true,
"bin": {
"detect-libc": "bin/detect-libc.js"
},
"engines": {
"node": ">=0.10"
}
},
"node_modules/ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
"integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
"dependencies": {
"jsbn": "~0.1.0",
"safer-buffer": "^2.1.0"
}
},
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
},
"node_modules/encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/end-of-stream": {
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
"optional": true,
"dependencies": {
"once": "^1.4.0"
}
},
"node_modules/escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
},
"node_modules/etag": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/expand-template": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
"integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
"optional": true,
"engines": {
"node": ">=6"
}
},
"node_modules/express": {
"version": "4.17.1",
"resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
"integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
"dependencies": {
"accepts": "~1.3.7",
"array-flatten": "1.1.1",
"body-parser": "1.19.0",
"content-disposition": "0.5.3",
"content-type": "~1.0.4",
"cookie": "0.4.0",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "~1.1.2",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"finalhandler": "~1.1.2",
"fresh": "0.5.2",
"merge-descriptors": "1.0.1",
"methods": "~1.1.2",
"on-finished": "~2.3.0",
"parseurl": "~1.3.3",
"path-to-regexp": "0.1.7",
"proxy-addr": "~2.0.5",
"qs": "6.7.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.1.2",
"send": "0.17.1",
"serve-static": "1.14.1",
"setprototypeof": "1.1.1",
"statuses": "~1.5.0",
"type-is": "~1.6.18",
"utils-merge": "1.0.1",
"vary": "~1.1.2"
},
"engines": {
"node": ">= 0.10.0"
}
},
"node_modules/extend": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
},
"node_modules/extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
"engines": [
"node >=0.6.0"
]
},
"node_modules/fast-deep-equal": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
"integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA=="
},
"node_modules/fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
},
"node_modules/file-uri-to-path": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
"integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
"optional": true
},
"node_modules/finalhandler": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
"integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
"dependencies": {
"debug": "2.6.9",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"on-finished": "~2.3.0",
"parseurl": "~1.3.3",
"statuses": "~1.5.0",
"unpipe": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/forever-agent": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
"integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
"engines": {
"node": "*"
}
},
"node_modules/form-data": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
"integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.6",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 0.12"
}
},
"node_modules/forwarded": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
"integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/fs-constants": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
"optional": true
},
"node_modules/gauge": {
"version": "2.7.4",
"resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
"integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
"optional": true,
"dependencies": {
"aproba": "^1.0.3",
"console-control-strings": "^1.0.0",
"has-unicode": "^2.0.0",
"object-assign": "^4.1.0",
"signal-exit": "^3.0.0",
"string-width": "^1.0.1",
"strip-ansi": "^3.0.1",
"wide-align": "^1.1.0"
}
},
"node_modules/getpass": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
"integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
"dependencies": {
"assert-plus": "^1.0.0"
}
},
"node_modules/github-from-package": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
"integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=",
"optional": true
},
"node_modules/har-schema": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
"integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
"engines": {
"node": ">=4"
}
},
"node_modules/har-validator": {
"version": "5.1.3",
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
"integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
"dependencies": {
"ajv": "^6.5.5",
"har-schema": "^2.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/has-unicode": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
"optional": true
},
"node_modules/http-errors": {
"version": "1.7.2",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
"integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
"dependencies": {
"depd": "~1.1.2",
"inherits": "2.0.3",
"setprototypeof": "1.1.1",
"statuses": ">= 1.5.0 < 2",
"toidentifier": "1.0.0"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/http-signature": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
"integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
"dependencies": {
"assert-plus": "^1.0.0",
"jsprim": "^1.2.2",
"sshpk": "^1.7.0"
},
"engines": {
"node": ">=0.8",
"npm": ">=1.3.7"
}
},
"node_modules/iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
},
"node_modules/ini": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
"integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
"optional": true,
"engines": {
"node": "*"
}
},
"node_modules/ipaddr.js": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
"engines": {
"node": ">= 0.10"
}
},
"node_modules/is-fullwidth-code-point": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"optional": true,
"dependencies": {
"number-is-nan": "^1.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
},
"node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
},
"node_modules/isstream": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
},
"node_modules/jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
},
"node_modules/json-schema": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
"integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
},
"node_modules/json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
},
"node_modules/json-stringify-safe": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
},
"node_modules/jspack": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/jspack/-/jspack-0.0.4.tgz",
"integrity": "sha1-Mt01x/3LPjRWwY+7fvntC8YjgXc="
},
"node_modules/jsprim": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
"integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
"engines": [
"node >=0.6.0"
],
"dependencies": {
"assert-plus": "1.0.0",
"extsprintf": "1.3.0",
"json-schema": "0.2.3",
"verror": "1.10.0"
}
},
"node_modules/kafka-node": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/kafka-node/-/kafka-node-5.0.0.tgz",
"integrity": "sha512-dD2ga5gLcQhsq1yNoQdy1MU4x4z7YnXM5bcG9SdQuiNr5KKuAmXixH1Mggwdah5o7EfholFbcNDPSVA6BIfaug==",
"dependencies": {
"async": "^2.6.2",
"binary": "~0.3.0",
"bl": "^2.2.0",
"buffer-crc32": "~0.2.5",
"buffermaker": "~1.2.0",
"debug": "^2.1.3",
"denque": "^1.3.0",
"lodash": "^4.17.4",
"minimatch": "^3.0.2",
"nested-error-stacks": "^2.0.0",
"optional": "^0.1.3",
"retry": "^0.10.1",
"uuid": "^3.0.0"
},
"engines": {
"node": ">=8.5.1"
},
"optionalDependencies": {
"snappy": "^6.0.1"
}
},
"node_modules/lodash": {
"version": "4.17.15",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
"integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
},
"node_modules/long": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/long/-/long-1.1.2.tgz",
"integrity": "sha1-6u9ZUcp1UdlpJrgtokLbnWso+1M=",
"engines": {
"node": ">=0.6"
}
},
"node_modules/media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
"integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
},
"node_modules/methods": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
"integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mime": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
"bin": {
"mime": "cli.js"
},
"engines": {
"node": ">=4"
}
},
"node_modules/mime-db": {
"version": "1.43.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz",
"integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mime-types": {
"version": "2.1.26",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz",
"integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==",
"dependencies": {
"mime-db": "1.43.0"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mimic-response": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz",
"integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==",
"optional": true,
"engines": {
"node": ">=8"
}
},
"node_modules/minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dependencies": {
"brace-expansion": "^1.1.7"
},
"engines": {
"node": "*"
}
},
"node_modules/minimist": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
"optional": true
},
"node_modules/mkdirp": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"optional": true,
"dependencies": {
"minimist": "0.0.8"
},
"bin": {
"mkdirp": "bin/cmd.js"
}
},
"node_modules/mkdirp/node_modules/minimist": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
"optional": true
},
"node_modules/morgan": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz",
"integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==",
"dependencies": {
"basic-auth": "~2.0.0",
"debug": "2.6.9",
"depd": "~1.1.2",
"on-finished": "~2.3.0",
"on-headers": "~1.0.1"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"node_modules/nan": {
"version": "2.14.0",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
"integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==",
"optional": true
},
"node_modules/napi-build-utils": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.1.tgz",
"integrity": "sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA==",
"optional": true
},
"node_modules/negotiator": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
"integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/nested-error-stacks": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz",
"integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug=="
},
"node_modules/node-abi": {
"version": "2.15.0",
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.15.0.tgz",
"integrity": "sha512-FeLpTS0F39U7hHZU1srAK4Vx+5AHNVOTP+hxBNQknR/54laTHSFIJkDWDqiquY1LeLUgTfPN7sLPhMubx0PLAg==",
"optional": true,
"dependencies": {
"semver": "^5.4.1"
}
},
"node_modules/noop-logger": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz",
"integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=",
"optional": true
},
"node_modules/npmlog": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
"integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
"optional": true,
"dependencies": {
"are-we-there-yet": "~1.1.2",
"console-control-strings": "~1.1.0",
"gauge": "~2.7.3",
"set-blocking": "~2.0.0"
}
},
"node_modules/number-is-nan": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
"optional": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/oauth-sign": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
"engines": {
"node": "*"
}
},
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
"optional": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
"dependencies": {
"ee-first": "1.1.1"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/on-headers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
"integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"optional": true,
"dependencies": {
"wrappy": "1"
}
},
"node_modules/optional": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/optional/-/optional-0.1.4.tgz",
"integrity": "sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw=="
},
"node_modules/parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
},
"node_modules/performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
},
"node_modules/prebuild-install": {
"version": "5.3.3",
"resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.3.tgz",
"integrity": "sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g==",
"optional": true,
"dependencies": {
"detect-libc": "^1.0.3",
"expand-template": "^2.0.3",
"github-from-package": "0.0.0",
"minimist": "^1.2.0",
"mkdirp": "^0.5.1",
"napi-build-utils": "^1.0.1",
"node-abi": "^2.7.0",
"noop-logger": "^0.1.1",
"npmlog": "^4.0.1",
"pump": "^3.0.0",
"rc": "^1.2.7",
"simple-get": "^3.0.3",
"tar-fs": "^2.0.0",
"tunnel-agent": "^0.6.0",
"which-pm-runs": "^1.0.0"
},
"bin": {
"prebuild-install": "bin.js"
},
"engines": {
"node": ">=6"
}
},
"node_modules/process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
},
"node_modules/proxy-addr": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
"integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
"dependencies": {
"forwarded": "~0.1.2",
"ipaddr.js": "1.9.1"
},
"engines": {
"node": ">= 0.10"
}
},
"node_modules/psl": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz",
"integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ=="
},
"node_modules/pump": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
"optional": true,
"dependencies": {
"end-of-stream": "^1.1.0",
"once": "^1.3.1"
}
},
"node_modules/punycode": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
"engines": {
"node": ">=6"
}
},
"node_modules/qs": {
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
"integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
"engines": {
"node": ">=0.6"
}
},
"node_modules/range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/raw-body": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
"integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
"dependencies": {
"bytes": "3.1.0",
"http-errors": "1.7.2",
"iconv-lite": "0.4.24",
"unpipe": "1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/rc": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
"integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
"optional": true,
"dependencies": {
"deep-extend": "^0.6.0",
"ini": "~1.3.0",
"minimist": "^1.2.0",
"strip-json-comments": "~2.0.1"
},
"bin": {
"rc": "cli.js"
}
},
"node_modules/readable-stream": {
"version": "2.3.7",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dependencies": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
"isarray": "~1.0.0",
"process-nextick-args": "~2.0.0",
"safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
}
},
"node_modules/request": {
"version": "2.88.2",
"resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
"integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
"dependencies": {
"aws-sign2": "~0.7.0",
"aws4": "^1.8.0",
"caseless": "~0.12.0",
"combined-stream": "~1.0.6",
"extend": "~3.0.2",
"forever-agent": "~0.6.1",
"form-data": "~2.3.2",
"har-validator": "~5.1.3",
"http-signature": "~1.2.0",
"is-typedarray": "~1.0.0",
"isstream": "~0.1.2",
"json-stringify-safe": "~5.0.1",
"mime-types": "~2.1.19",
"oauth-sign": "~0.9.0",
"performance-now": "^2.1.0",
"qs": "~6.5.2",
"safe-buffer": "^5.1.2",
"tough-cookie": "~2.5.0",
"tunnel-agent": "^0.6.0",
"uuid": "^3.3.2"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/request/node_modules/qs": {
"version": "6.5.2",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
"engines": {
"node": ">=0.6"
}
},
"node_modules/retry": {
"version": "0.10.1",
"resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz",
"integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=",
"engines": {
"node": "*"
}
},
"node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"node_modules/semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"optional": true,
"bin": {
"semver": "bin/semver"
}
},
"node_modules/send": {
"version": "0.17.1",
"resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
"integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
"dependencies": {
"debug": "2.6.9",
"depd": "~1.1.2",
"destroy": "~1.0.4",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"fresh": "0.5.2",
"http-errors": "~1.7.2",
"mime": "1.6.0",
"ms": "2.1.1",
"on-finished": "~2.3.0",
"range-parser": "~1.2.1",
"statuses": "~1.5.0"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/send/node_modules/ms": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
},
"node_modules/serve-static": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
"integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
"dependencies": {
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
"send": "0.17.1"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/set-blocking": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
"optional": true
},
"node_modules/setprototypeof": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
"integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
},
"node_modules/signal-exit": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
"optional": true
},
"node_modules/simple-concat": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz",
"integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=",
"optional": true
},
"node_modules/simple-get": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz",
"integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==",
"optional": true,
"dependencies": {
"decompress-response": "^4.2.0",
"once": "^1.3.1",
"simple-concat": "^1.0.0"
}
},
"node_modules/snappy": {
"version": "6.2.3",
"resolved": "https://registry.npmjs.org/snappy/-/snappy-6.2.3.tgz",
"integrity": "sha512-HZpVoIxMfQ4fL3iDuMdI1R5xycw1o9YDCAndTKZCY/EHRoKFvzwplttuBBVGeEg2fd1hYiwAXos/sM24W7N1LA==",
"optional": true,
"dependencies": {
"bindings": "^1.3.1",
"nan": "^2.14.0",
"prebuild-install": "^5.2.2"
}
},
"node_modules/sshpk": {
"version": "1.16.1",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
"integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
"dependencies": {
"asn1": "~0.2.3",
"assert-plus": "^1.0.0",
"bcrypt-pbkdf": "^1.0.0",
"dashdash": "^1.12.0",
"ecc-jsbn": "~0.1.1",
"getpass": "^0.1.1",
"jsbn": "~0.1.0",
"safer-buffer": "^2.0.2",
"tweetnacl": "~0.14.0"
},
"bin": {
"sshpk-conv": "bin/sshpk-conv",
"sshpk-sign": "bin/sshpk-sign",
"sshpk-verify": "bin/sshpk-verify"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/statuses": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dependencies": {
"safe-buffer": "~5.1.0"
}
},
"node_modules/string-width": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"optional": true,
"dependencies": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
"strip-ansi": "^3.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/strip-ansi": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"optional": true,
"dependencies": {
"ansi-regex": "^2.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/strip-json-comments": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
"optional": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/tar-fs": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz",
"integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==",
"optional": true,
"dependencies": {
"chownr": "^1.1.1",
"mkdirp": "^0.5.1",
"pump": "^3.0.0",
"tar-stream": "^2.0.0"
}
},
"node_modules/tar-stream": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.0.tgz",
"integrity": "sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw==",
"optional": true,
"dependencies": {
"bl": "^3.0.0",
"end-of-stream": "^1.4.1",
"fs-constants": "^1.0.0",
"inherits": "^2.0.3",
"readable-stream": "^3.1.1"
}
},
"node_modules/tar-stream/node_modules/bl": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/bl/-/bl-3.0.0.tgz",
"integrity": "sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A==",
"optional": true,
"dependencies": {
"readable-stream": "^3.0.1"
}
},
"node_modules/tar-stream/node_modules/readable-stream": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
"integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
"optional": true,
"dependencies": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
"util-deprecate": "^1.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/toidentifier": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
"integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
"engines": {
"node": ">=0.6"
}
},
"node_modules/tough-cookie": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
"integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
"dependencies": {
"psl": "^1.1.28",
"punycode": "^2.1.1"
},
"engines": {
"node": ">=0.8"
}
},
"node_modules/traverse": {
"version": "0.3.9",
"resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz",
"integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk="
},
"node_modules/tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
"dependencies": {
"safe-buffer": "^5.0.1"
},
"engines": {
"node": "*"
}
},
"node_modules/tweetnacl": {
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
},
"node_modules/type-is": {
"version": "1.6.18",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
"dependencies": {
"media-typer": "0.3.0",
"mime-types": "~2.1.24"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/uri-js": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
"integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
"dependencies": {
"punycode": "^2.1.0"
}
},
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
},
"node_modules/utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/uuid": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
"bin": {
"uuid": "bin/uuid"
}
},
"node_modules/vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/verror": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
"integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
"engines": [
"node >=0.6.0"
],
"dependencies": {
"assert-plus": "^1.0.0",
"core-util-is": "1.0.2",
"extsprintf": "^1.2.0"
}
},
"node_modules/which-pm-runs": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz",
"integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=",
"optional": true
},
"node_modules/wide-align": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
"integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
"optional": true,
"dependencies": {
"string-width": "^1.0.2 || 2"
}
},
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"optional": true
}
},
"dependencies": { "dependencies": {
"accepts": { "accepts": {
"version": "1.3.7", "version": "1.3.7",
...@@ -611,6 +2190,11 @@ ...@@ -611,6 +2190,11 @@
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
}, },
"jspack": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/jspack/-/jspack-0.0.4.tgz",
"integrity": "sha1-Mt01x/3LPjRWwY+7fvntC8YjgXc="
},
"jsprim": { "jsprim": {
"version": "1.4.1", "version": "1.4.1",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
...@@ -1111,6 +2695,14 @@ ...@@ -1111,6 +2695,14 @@
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
}, },
"string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"requires": {
"safe-buffer": "~5.1.0"
}
},
"string-width": { "string-width": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
...@@ -1122,14 +2714,6 @@ ...@@ -1122,14 +2714,6 @@
"strip-ansi": "^3.0.0" "strip-ansi": "^3.0.0"
} }
}, },
"string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"requires": {
"safe-buffer": "~5.1.0"
}
},
"strip-ansi": { "strip-ansi": {
"version": "3.0.1", "version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
"dependencies": { "dependencies": {
"body-parser": "^1.19.0", "body-parser": "^1.19.0",
"express": "^4.17.1", "express": "^4.17.1",
"jspack": "^0.0.4",
"kafka-node": "^5.0.0", "kafka-node": "^5.0.0",
"morgan": "^1.9.1", "morgan": "^1.9.1",
"request": "^2.88.2" "request": "^2.88.2"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment