Git Product home page Git Product logo

cordova-plugin-chrome-apps-sockets-tcp's Introduction

chrome.sockets.tcp Plugin

Plugin is no longer being developed by the MobileChromeApps team.

You might want to have a look at KoenLav's fork.

cordova-plugin-chrome-apps-sockets-tcp's People

Contributors

agrieve avatar clelland avatar fredrikeldh avatar jpchase avatar kamrik avatar koenlav avatar mmocny avatar oahziur avatar profonno avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cordova-plugin-chrome-apps-sockets-tcp's Issues

Packets reordered then TCP Window becomes full

When the TCP window specified by cordova-plugin-chrome-apps-sockets-tcp is full, the plugin incorrectly reorders packets. (Decreasing bufferSize causes this bug to be more easily triggered)

This is likely the cause of issue #14.

The following is my reassembly of a packet stream, in which the 3rd and 4th packets are fed to the client in the wrong order. The pipe symbol is the boundary between sequential data packets.

offset        0: ws                 |fabfb5da696e7600	 ds                 |fabfb5da696e7600
offset     1472: ws b1580a020000004f|314e67b3f9a2dab2	 ds b1580a020000004f|314e67b3f9a2dab2
offset     2920: ws bc2bdca8d063b8c3|2b4957c8f718dc39	 ds bc2bdca8d063b8c3|1b50bbb5a6613c6a
offset     4368: ws f9d3da5b4c28c34b|1b50bbb5a6613c6a	 ds 873eaffd178df798|2b4957c8f718dc39
offset     5816: ws 873eaffd178df798|8b3a9b2bcca36f02	 ds f9d3da5b4c28c34b|8b3a9b2bcca36f02
offset     7264: ws 292fc5406b7f0e02|0000002868810b07	 ds 292fc5406b7f0e02|0000002868810b07

The left side comes from wireshark, the packet trace I've uploaded here: https://github.com/VidaID/cordova-plugin-chrome-apps-sockets-tcp/blob/180-signverify/tcpreorder.pcapng.gz
The right side is the sequence of onReceive data events received by my app, using the chrome-net plugin.

The erroneous reorderings occur in frames 129 and 131 of the wireshark dump.

Any clue what's going on here?

chrome.sockets.tcp on iPad: can't disconnect

Hello, I am developing a cordova/cca application with cordova-plugin-chrome-apps-sockets-tcp 1.3.6.

Everything fine in chrome (as extension) and in android, but in iPad (iOs 9.3.5) I can't disconnect the sockets.

If I try (even from command line using Safari Develop):

chrome.sockets.tcp.getSockets( function(s){ console.log(JSON.stringify(s))} )

I get:

[
{"socketId":1,"name":"","bufferSize":4096,"connected":false,"persistent":false,"paused":false},    {"connected":true,"peerAddress":"192.168.0.54","socketId":2,"name":"","bufferSize":4096,"peerPort":502,"localAddress":"192.168.0.56","persistent":false,"localPort":49507,"paused":false}
]

I can disconnect/close the socket 1 (already not connected):

chrome.sockets.tcp.disconnect(1, function() { console.log('ok')})
ok
chrome.sockets.tcp.close(1, function() { console.log('ok')})
ok

But I can not disconnect from and active socket (ID 2 in the example):

chrome.sockets.tcp.disconnect(2, function() { console.log('ok')})
(NO RESPONSE / HANGING)

Same for:

chrome.sockets.tcp.close(2, function() { console.log('ok')})
(NO RESPONSE / HANGING)

Note: if I lock the screen and resume the application, all sockets are disconnected by the system.

Please tell me if you need more information (I am newbie in the cordova world)

Davide

How to setup a TCP connection on ad-hoc wifi network

I have a plug connector that creates an ad-hoc wifi network with the onboard diagnostic (OBD) on a car. I'm making an ionic app that needs to write a OBD command over the network to get the VIN number of the car back.

I'm able to connect my mobile device to the plug's wifi network and I have the ip address and the port that the plug communicates over. But when I try to run chrome.sockets.tcp.connect( SOME_INT, 'IP_STRING, PORT_INT, CB) from the chrome console in a debugger it returns undefined.

Is the socket ID integer just a number arbitrarily chosen? Is this a use case that the library should support? Any help is appreciated.

Thanks

onRecieve never fires!

Hey, on Android 6.0 the onRecieve event does not seem to fire at all.

The following is my code for handling the sockets, is there some error in my code ? (It is ported from the chrome-tcp-server example. When I create a TCPServer object, and try to connect to it, I do get to the point till the connection socket is created. But no data events are fired on the socket itself.

(I am using eshttp for the http server based on the top of this)

import {EventEmitter} from 'events';
import Debug from 'debug';

const serverLog = Debug('tcp:Server');
const connLog = Debug('tcp:Connection');
const ServerSocket = chrome.sockets.tcpServer;
const ConnectionSocket = chrome.sockets.tcp;


const noop = () => {};

export class TCPServer extends EventEmitter{
  constructor({maxConnections = 5}={}){
    super();
    this.socketId = -1;
    this.addr = '';
    this.port = '';
    this.clients = [];

    this._handleAccept = this._handleAccept.bind(this);
    this._handleAcceptError = this._handleAcceptError.bind(this);

    ServerSocket.onAccept.addListener(this._handleAccept);
    ServerSocket.onAcceptError.addListener(this._handleAcceptError);

    serverLog('Attempting to open socket');
    ServerSocket.create({},
      createInfo => this._socketCreated(createInfo)
    );
  }

  get isUsable(){
    return this.socketId > -1;
  }

  _socketCreated({socketId}){
    if( socketId < 0 ){
      serverLog('Socket Listening failure');
      return;
    }
    this.socketId = socketId;
    serverLog('Socket Successfully connected');
  }

  _handleAccept({socketId, clientSocketId}){
    if( socketId !== this.socketId ){
      return;
    }

    serverLog('New connection');
    const tcpConnection = new TCPConnection(clientSocketId, this);
    this.clients.push(tcpConnection);

    tcpConnection.once('info',
      () => this.emit('connection', tcpConnection)
    );

    tcpConnection.once('close', () => {
      this.clients = this.clients.filter(
        tc => tc.socketId !== tcpConnection.socketId
      );
    });

    tcpConnection.requestSocketInfo();
  }

  _handleAcceptError({socketId, errorCode}){
    // this.close();
    if( socketId !== this.socketId ){
      return;
    }
    serverLog('Error accepting new connections CODE:' + errorCode);
    this.emit('error', new Error(errorCode));
    ServerSocket.setPaused(this.socketId, false, () => {
      serverLog('Listening for new connections is resumed');
    });
  }

  listen(port=8080, addr='0.0.0.0'){
    this.addr = addr;
    this.port = port;
    serverLog(`Now trying to listen on ${addr}:${port}`);
    ServerSocket.listen(
      this.socketId, this.addr, this.port,
      result => this._listenCallback(result)
    );
  }

  _listenCallback(result){
    if( result < 0 ){
      serverLog('Socket could not listen, error : ', result);
      this.emit('error', result);
      return;
    }
    serverLog('Socket is now listening for open connections');
    this.emit('listening');
  }

  close(callback = noop){
    serverLog('Closing socket');
    ServerSocket.onAccept.removeListener(this._handleAccept);
    ServerSocket.onAcceptError.removeListener(this._handleAcceptError);
    this.once('close', callback);

    ChromeSocketServer.close(this.socketId, () =>{
      serverLog('Socket successfully closed');
      this.socketId = -1;
      this.emit('close');
    });
  }

  getConnections(callback = noop){
    setImmediate(() => callback(null, this.clients));
  }
}

export class TCPConnection extends EventEmitter{
  constructor(socketId, owner = null){
    super();
    this.socketId = socketId;
    this.owner   = owner;

    connLog('Connection created for socket id ');
    this._handleRecieveError = this._handleRecieveError.bind(this);
    this._handleRecieve = this._handleRecieve.bind(this);
    this._handleWrite = this._handleWrite.bind(this);
    this._close = this._close.bind(this);

    ConnectionSocket.onReceive.addListener(this._handleRecieve);
    ConnectionSocket.onReceiveError.addListener(this._handleRecieveError);
  }

  get isUsable(){
    return this.socketId > -1;
  }

  // Write data down the pipe
  send(u8){
    connLog('Sending data');
    ConnectionSocket.send(this.socketId, u8, this._handleWrite);
  }

  _close(){
    connLog('Closing connection');
    ConnectionSocket.onReceive.removeListener(this._handleRecieve);
    ConnectionSocket.onReceiveError.removeListener(this._handleRecieveError);
    ConnectionSocket.close(this.socketId, () => {
      this.emit('close');
      this.socketId = -1;
    })
  }

  close(u8){
    if( u8 ){
      connLog('Sending data');
      ConnectionSocket.send(this.socketId, u8, this._close);
    }
    this._close();
  }

  _handleWrite(info){
    this.emit('write', info);
  }

  _handleRecieve({socketId, data}){
    connLog('data received');
    if( socketId !== this.socketId ){
      return;
    }
    connLog('data was handled');
    this.emit('data', data);
  }

  _handleRecieveError({socketId, resultCode}){
    if( socketId !== this.socketId ){
      return;
    }
    connLog('Error on socket Code:' + resultCode);
    this.had_error = true;
    this.emit('error', new Error(resultCode));
    this.close();
  }

  requestSocketInfo(){
    ConnectionSocket
      .getInfo(this.socketId, (info) => {
        this.meta = info;
        this.emit('info', info);
      });
  }
}

Are Cordova Chrome App(CCA) plugins compatible w/ Cordova/ionic app

I have an ionic app that needs to make a TCP socket connection between it and a Wifi access point(no internet just a local access point).

I was able to create the TCP socket, connect, send and receive with Chrome Sockets(Deprecated) . But I always got the same string back in the response that I sent over the connection which was not the expected behavior.

When I moved to this supported Chrome Sockets TCP lib I could create the socket but not connect to it. I came across this CCA command line tool tutorial after seeing some Stack Overflow posts talking about a manifest.mobile.json file which I did not have in my ionic app.

I installed the CCA command line tool and ran through the tutorial to create a basic CCA app. I grabbed the generated manifest.mobile.json file from that and threw it in the www folder of mine and tried to connect again with no better results. Here is the generated manifest.mobile.json file with a few lines I added;

 {
  "packageId": "com.your.company.ChromeApp",
  // Android-only overrides here (e.g. icons, name, version)
  "android": {
  },
  // iOS-only overrides here (e.g. icons, name, version)
  "ios": {
  },
  // Uncomment to use system WebView rather than Crosswalk
   "webview": "system",

  // Uncomment to enable use of eval()
   "cspUnsafeEval": true,

  // Uncomment to enable use of inline <script>
   "cspUnsafeInline": true,

   "sockets": {
      "tcp": {"connect" : "*"}
   }
}

And this is the code used to make and connect to the tcp socket

 chrome.sockets.tcp.create(function(createInfo) {
            chrome.sockets.tcp.connect(createInfo.socketId, 'MY_IP', MY_PORT, function(result) {
              if (result === 0) {
                chrome.sockets.tcp.send(createInfo.socketId, PID, function(result) {
                  if (result.resultCode === 0) {
                    console.log('connectAndSend: success');
                    chrome.sockets.tcp.disconnect(createInfo.socketId);
                    chrome.sockets.tcp.close(createInfo.socketId);
                  }
                });
              }
            });
          });

And the error message I get

failed to connect to /MY_IP (port MY_PORT): connect failed: ENETUNREACH (Network is unreachable)
callbackWithError @ errors.js:30
fail @ sockets.tcp.js:68
cordova.callbackFromNative @ cordova.js:293
processMessage @ cordova.js:1079
processMessages @ cordova.js:1102

android.os.NetworkOnMainThreadException

Hi,

An android.os.NetworkOnMainThreadException is thrown when trying to connect. This exception is thrown only at Android 4.1.1 API level 16. Everything above Android 4.1.1 API level 16 seems to work fine.

Tested with version 1.3.4 of the plugin.

Should the connect() method run on a seperate thread ? Or is this an issue on Android 4.1.1 only ? Or maybe i am doing something wrong ?

I am using the plugin inside an ionic project.

Something like:

    window.chrome.sockets.tcp.create({}, function(createInfo) {
      console.log('socket created ', JSON.stringify(createInfo));
      window.chrome.sockets.tcp.connect(createInfo.socketId, '127.0.0.1', 8100, function(connectionInfo) {
        console.log('socket connected ', JSON.stringify(connectionInfo));
        var message = str2ab('hello world');
        window.chrome.sockets.tcp.send(createInfo.socketId, message, function(sendInfo) {
          console.log('Message send ', JSON.stringify(sendInfo));
        });
      });
    });

Complete stacktrace:


E/PluginManager( 1228): android.os.NetworkOnMainThreadException
E/PluginManager( 1228):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
E/PluginManager( 1228):     at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
E/PluginManager( 1228):     at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
E/PluginManager( 1228):     at libcore.io.IoBridge.connect(IoBridge.java:112)
E/PluginManager( 1228):     at libcore.io.IoBridge.connect(IoBridge.java:100)
E/PluginManager( 1228):     at java.nio.SocketChannelImpl.connect(SocketChannelImpl.java:168)
E/PluginManager( 1228):     at org.chromium.ChromeSocketsTcp$TcpSocket.connect(ChromeSocketsTcp.java:779)
E/PluginManager( 1228):     at org.chromium.ChromeSocketsTcp.connect(ChromeSocketsTcp.java:239)
E/PluginManager( 1228):     at org.chromium.ChromeSocketsTcp.execute(ChromeSocketsTcp.java:63)
E/PluginManager( 1228):     at org.apache.cordova.CordovaPlugin.execute(CordovaPlugin.java:117)
E/PluginManager( 1228):     at org.apache.cordova.CordovaPlugin.execute(CordovaPlugin.java:98)
E/PluginManager( 1228):     at org.apache.cordova.PluginManager.exec(PluginManager.java:133)
E/PluginManager( 1228):     at org.apache.cordova.CordovaBridge.jsExec(CordovaBridge.java:59)
E/PluginManager( 1228):     at org.apache.cordova.CordovaBridge.promptOnJsPrompt(CordovaBridge.java:135)
E/PluginManager( 1228):     at org.apache.cordova.engine.SystemWebChromeClient.onJsPrompt(SystemWebChromeClient.java:124)
E/PluginManager( 1228):     at android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:655)
E/PluginManager( 1228):     at android.os.Handler.dispatchMessage(Handler.java:99)
E/PluginManager( 1228):     at android.os.Looper.loop(Looper.java:137)
E/PluginManager( 1228):     at android.app.ActivityThread.main(ActivityThread.java:4745)
E/PluginManager( 1228):     at java.lang.reflect.Method.invokeNative(Native Method)
E/PluginManager( 1228):     at java.lang.reflect.Method.invoke(Method.java:511)
E/PluginManager( 1228):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
E/PluginManager( 1228):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
E/PluginManager( 1228):     at dalvik.system.NativeStart.main(Native Method)

setKeepAlive function is not added in iOS

Hi ,

I can the "setKeepAlive" function is available for android but not for iOS.Any specific reason ?
I want to make the connection alive for hours but its closing immediately .Any way to achieve it ?

Regards,
Kabilan Baskaran.

Any demo?

Is there any demo how to e.g. run a TCP receiver on port 1234 and console.log every message? I don't see how to use linked chrome documentation here

Long messages are arbitrarily cut

Dear all,
This is a great cordova plugin. It has reliably worked for me in most situations.

However, if I have a long response message the response is cut arbitrarily and another onReceive Event is triggered with the rest of the message... (very long messages are even cut into multiple pieces). This wouldn't be a problem if there would be some kind of mechanism to check what should get together.

If it is unclear what I mean, I can provide an example where a IRC server is called and the users of a channel are queried. Effectively this is a long string. The response (depending on the size) is cut into various pieces. There is however no indication on how to glue these together other than information inside the message itself, which is very error prone...

getinfo on socket from accept in tcpServer plugin does not provide peerAddress on IOS

my app needs the peeraddress of the socket created from an onAccept()

this works great on android, but is 'undefined' on ios... help

I am using the tcp plugin to get the info
in the chrome.sockets.tcp.onReceive.addListener callback
chrome.sockets.tcp.getInfo(info.socketId, function(info) { var serveraddress = info.peerAddress + ":" + port_info;

Cordova 6 iOS Support

When will this plugin support Cordova 6 iOS apps? I installed it, and I see entries in the cordova_plugins.js as well as javascript files in the staging plugins folder. However, I get a undefined message for chrome.socket.create. Any help or info would be much appreciated.

how to find port used for listen (typically next available)

I have this existing protocol, where I

  • setup a tcp/ip listen (any port, next available, don't want to hard code)
  • get the port for the listen
  • send a UDP broadcast to a custom server, with the port number in the message data
  • the server parses the message, gets the port number
  • server opens socket back to client (listen),
  • server sends message containing server address.

I am using the udp and tcp plugins..
chrome.sockets.tcp.onReceive.addListener(recvListener);
sendTo(MirrorRequest+ip, ReceiverPort, BROADCAST_ADDR);

chrome.sockets.tcp throws null error when there is no internet connection on device

[Migrated from https://bugs.chromium.org/p/chromium/issues/detail?id=449527]

Steps to reproduce the problem:

  1. Start a cordova app on android with the chrome.sockets.tcp plugin
  2. Create a tcp socket
  3. Make sure the device have no Internet connection, and attempt a tcp connection to google.com (or any other website) with chrome.sockets.tcp.connect
  4. The error should show up in error log.

What is the expected behavior?
The fail callback is expected to be called with some error information.

What went wrong?
On sockets.tcp.js line 68, the error argument is passed in as 'null'. Cordova then throws the error

'processmessage Failed: Error: TypeError: Cannot read property 'message' of null'.

Did this work before? N/A

Chrome version: None (Android webview) Channel: stable
OS Version: 4.4.4
Flash Version: Shockwave Flash 11.2 r202

This behavior is not ideal because I would like to retry connections if the connect attempt fails.
I currently have a fix by adding this line in the sockets.tcp.js file:

if (!error){
  error = {message: 'unknown error', resultCode: -100};
}

Connection reset not detectable

I have a server on my Android phone using chrome.sockets.tcpServer API. When remote peer successfully connects, the communication is fine. However, when remote peer gets disconnected in a non clean way (no power, wi-fi lost) I cannot get any information that client socket has been reset. chrome.sockets.tcp.getInfo(clientSocket) says socket is still connected. chrome.sockets.tcp.send(clientSocket, data) returns resultCode=0. chrome.sockets.tcp.onReceiveError is not fired, except when I disable the personal hotspot as I use the program as a wifi server waiting for clients to connect. Sometimes, after a long time > 120 secs chrome.sockets.tcp.onReceiveError is called saying that clientSocket has been reset. I'm running Android 10.
Absolutely identical is the behavior on iOS - if the client loses power (unclean disconnect) I do not get any callback in the server code.

Problem with some android versions?

I've tried 4 or 5 devices for now, from different manufacturer. Generally the plugin works well, only on a samsung s4 mini (android 4.2.2) the plugin fails without errors (and the same for sockets-upd plugin too). There are any known incompatibility? There are some tests that I can try to identify or resolve this problem?

Thanks.

SNI support

My app was experiencing timeouts when connecting to some domains. To make a reduced testcase, I started with the 'TCP secure get https website three times' test (https://github.com/MobileChromeApps/cordova-plugin-chrome-apps-sockets-tcp/blob/master/tests/tests.js#L793). Running that test on my Nexus 5X, by clicking the "Run" button in the test app with only chrome-sockets-tcp selected, I see flakiness, with maybe an 80% success rate. (The second run in particular seems to fail frequently.) I modified the target domain from httpbin.org to a0.awsstatic.com, and saw similar results. However, when I changed the target domain to sdk.amazonaws.com, I saw 100% failure.

In the last case, I set breakpoints to locate the failure. It appears that chrome.sockets.tcp.secure() never calls its callback, resulting in a test timeout.

The flakiness of the test does not seem surprising. In particular, any nagling or similar aggregation would break the recvCounter mechanism. However, I'm not aware of any difference between the a0.awsstatic.com and sdk.amazonaws.com domains that would logically explain the difference in behavior. (Both domains are hosted on Amazon Cloudfront, so they should behave almost identically.)

The only difference I've been able to find between these domains is that sdk.amazonaws.com is defined by a CNAME record, whereas a0.awsstatic.com is defined by an A record. The extra DNS lookup and secondary name should not be a problem, but perhaps a buggy TLS client could fail in this case.

Lost byte(s) when receive?

I've write an app that exchange data with a device by telnet using this plugin. I send a command and waiting for the reply. All seems to work, but the reply from the device is often too short, as the plugin lost the tail of the device transmission. The chrome.sockets.tcp.onReceive.addListener is atomic? Return the entire tcp packet? Or is called more time until the packet is finished?

Thanks.

This is my code:

    function sendPacketRaw(ipAddr,ipPort,data) {
        var delay= 5000;    /// 5 secondi
                var deferred= $q.defer();
        chrome.sockets.tcp.create({}, function(createInfo) {
            var _socketTcpId= createInfo.socketId;
            chrome.sockets.tcp.setPaused(_socketTcpId, false);
            chrome.sockets.tcp.connect(_socketTcpId, ipAddr, ipPort, function(result) {
                chrome.sockets.tcp.setPaused(_socketTcpId, false);
                if (result === 0) {
                    /// connessione ok, invia il pacchetto
                    var data2send= str2arrayBuffer(data);
                    chrome.sockets.tcp.send(_socketTcpId, data2send);
                }
            });
            chrome.sockets.tcp.onReceive.addListener(function(info) {
                /// got the reply, close the connection
                chrome.sockets.tcp.getInfo(_socketTcpId,function(socketInfo) {
                    if ( _socketTcpId == socketInfo.socketId ) {
                        var bb= new ByteBuffer(info.data);
                        var str= bb.readString();
                        console.log('rec: '+ str);
                        chrome.sockets.tcp.close(_socketTcpId);
                        deferred.resolve(str);
                    }
                });
            });
            chrome.sockets.tcp.onReceiveError.addListener(function(info) {
                chrome.sockets.tcp.getInfo(_socketTcpId,function(socketInfo) {
                    if ( _socketTcpId == socketInfo.socketId ) {
                        chrome.sockets.tcp.setPaused(_socketTcpId, false);
                    }
                });
            });
            /// set the timeout
            setTimeout(function() {
                chrome.sockets.tcp.getInfo(_socketTcpId,function(socketInfo) {
                    if ( _socketTcpId == socketInfo.socketId ) {
                        chrome.sockets.tcp.close(_socketTcpId);
                        deferred.reject();
                    }
                });
            }, delay);
        });
        return deferred.promise;
    }

Update to 1.3.9

Kindly requesting that you update npm to 1.3.9 from the github repo.

Thanks!

Chris

Error installing plugin

I'm trying to install the plugin but always gives me an error, can U tell me what's going on?

Here what I'm get:
Installing "cordova-plugin-chrome-apps-sockets-tcp" for android
Fetching plugin "cordova-plugin-chrome-apps-common@1" via plugin registry
npm http GET http://registry.cordova.io/cordova-plugin-chrome-apps-common
npm http 404 http://registry.cordova.io/cordova-plugin-chrome-apps-common
Failed to install 'cordova-plugin-chrome-apps-sockets-tcp':Error: 404 Not Found:
cordova-plugin-chrome-apps-common
at RegClient. (c:\Users\Jack\AppData\Roaming\npm\node_modules\cor
dova\node_modules\cordova-lib\node_modules\npm\node_modules\npm-registry-client
lib\request.js:268:14)
at Request.self.callback (c:\Users\Jack\AppData\Roaming\npm\node_modules\cor
dova\node_modules\cordova-lib\node_modules\npm\node_modules\request\index.js:148
:22)
at Request.emit (events.js:110:17)
at Request. (c:\Users\Jack\AppData\Roaming\npm\node_modules\cordo
va\node_modules\cordova-lib\node_modules\npm\node_modules\request\index.js:876:1
4)
at Request.emit (events.js:129:20)
at IncomingMessage. (c:\Users\Jack\AppData\Roaming\npm\node_modul
es\cordova\node_modules\cordova-lib\node_modules\npm\node_modules\request\index.
js:827:12)
at IncomingMessage.emit (events.js:129:20)
at _stream_readable.js:908:16
at process._tickCallback (node.js:355:11)
Error: 404 Not Found: cordova-plugin-chrome-apps-common
at RegClient. (c:\Users\Jack\AppData\Roaming\npm\node_modules\cor
dova\node_modules\cordova-lib\node_modules\npm\node_modules\npm-registry-client
lib\request.js:268:14)
at Request.self.callback (c:\Users\Jack\AppData\Roaming\npm\node_modules\cor
dova\node_modules\cordova-lib\node_modules\npm\node_modules\request\index.js:148
:22)
at Request.emit (events.js:110:17)
at Request. (c:\Users\Jack\AppData\Roaming\npm\node_modules\cordo
va\node_modules\cordova-lib\node_modules\npm\node_modules\request\index.js:876:1
4)
at Request.emit (events.js:129:20)
at IncomingMessage. (c:\Users\Jack\AppData\Roaming\npm\node_modul
es\cordova\node_modules\cordova-lib\node_modules\npm\node_modules\request\index.
js:827:12)
at IncomingMessage.emit (events.js:129:20)
at _stream_readable.js:908:16
at process._tickCallback (node.js:355:11)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.