{
  "name": "Port Control",
  "description": "Freedom port control manifest",
  "app": {
    "script": "port-control.js"
  },
  "constraints": {
    "isolation": "never"
  },
  "provides" : [
    "portControl"
  ],
  "default": "portControl",
  "api": {
    "portControl": {
      "addMapping": {
        "type": "method",
        "value": ["number", "number", "number"],
        "ret": {"internalIp": "string", "internalPort": "number",
                "externalIp": "string", "externalPort": "number",
                "lifetime": "number", "protocol": "string",
                "timeoutId": "number", "nonce": ["array", "number"],
                "errInfo": "string"}
      },

      "deleteMapping": {
        "type": "method",
        "value": ["number"],
        "ret": "boolean"
      },

      "probeProtocolSupport": {
        "type": "method",
        "value": [],
        "ret": {"natPmp": "boolean", "pcp": "boolean", "upnp": "boolean"}
      },

      "probePmpSupport": {
        "type": "method",
        "value": [],
        "ret": "boolean"
      },

      "addMappingPmp": {
        "type": "method",
        "value": ["number", "number", "number"],
        "ret": {"internalIp": "string", "internalPort": "number",
                "externalIp": "string", "externalPort": "number",
                "lifetime": "number", "protocol": "string",
                "timeoutId": "number", "nonce": ["array", "number"],
                "errInfo": "string"}
      },

      "deleteMappingPmp": {
        "type": "method",
        "value": ["number"],
        "ret": "boolean"
      },

      "probePcpSupport": {
        "type": "method",
        "value": [],
        "ret": "boolean"
      },

      "addMappingPcp": {
        "type": "method",
        "value": ["number", "number", "number"],
        "ret": {"internalIp": "string", "internalPort": "number",
                "externalIp": "string", "externalPort": "number",
                "lifetime": "number", "protocol": "string",
                "timeoutId": "number", "nonce": ["array", "number"],
                "errInfo": "string"}
      },

      "deleteMappingPcp": {
        "type": "method",
        "value": ["number"],
        "ret": "boolean"
      },

      "probeUpnpSupport": {
        "type": "method",
        "value": [],
        "ret": "boolean"
      },

      "addMappingUpnp": {
        "type": "method",
        "value": ["number", "number", "number", "string"],
        "ret": {"internalIp": "string", "internalPort": "number",
                "externalIp": "string", "externalPort": "number",
                "lifetime": "number", "protocol": "string",
                "timeoutId": "number", "nonce": ["array", "number"],
                "errInfo": "string"}
      },

      "deleteMappingUpnp": {
        "type": "method",
        "value": ["number"],
        "ret": "boolean"
      },

      "getUpnpControlUrl": {
        "type": "method",
        "value": [],
        "ret": "string"
      },

      "getActiveMappings": {
        "type": "method",
        "value": [],
        "ret": "object"
      },

      "getRouterIpCache": {
        "type": "method",
        "value": [],
        "ret": ["array", "string"]
      },

      "getProtocolSupportCache": {
        "type": "method",
        "value": [],
        "ret": {"natPmp": "boolean", "pcp": "boolean",
                "upnp": "boolean", "upnpControlUrl": "string"}
      },

      "getPrivateIps": {
        "type": "method",
        "value": [],
        "ret": ["array", "string"]
      },

      "close": {
        "type": "method",
        "value": []
      }
    }
  },
  "permissions": [
    "core.udpsocket",
    "core.rtcpeerconnection"
  ]
}
