Giter Site home page Giter Site logo

keroserene / snowflake Goto Github PK

View Code? Open in Web Editor NEW
275.0 13.0 30.0 2.5 MB

WebRTC Pluggable Transport - the original snowflake repo

Home Page: https://keroserene.net/snowflake/

License: Other

Go 99.99% Dockerfile 0.01%
censorship-circumvention webrtc tor

snowflake's Introduction

Snowflake

Build Status

Pluggable Transport using WebRTC, inspired by Flashproxy.

Table of Contents

Structure of this Repository

  • broker/ contains code for the Snowflake broker
  • doc/ contains Snowflake documentation and manpages
  • client/ contains the Tor pluggable transport client and client library code
  • common/ contains generic libraries used by multiple pieces of Snowflake
  • proxy/ contains code for the Go standalone Snowflake proxy
  • probetest/ contains code for a NAT probetesting service
  • server/ contains the Tor pluggable transport server and server library code

Usage

Snowflake is currently deployed as a pluggable transport for Tor.

Using Snowflake with Tor

To use the Snowflake client with Tor, you will need to add the appropriate Bridge and ClientTransportPlugin lines to your torrc file. See the client README for more information on building and running the Snowflake client.

Running a Snowflake Proxy

You can contribute to Snowflake by running a Snowflake proxy. We have the option to run a proxy in your browser or as a standalone Go program. See our community documentation for more details.

Using the Snowflake Library with Other Applications

Snowflake can be used as a Go API, and adheres to the v2.1 pluggable transports specification. For more information on using the Snowflake Go library, see the Snowflake library documentation.

Test Environment

There is a Docker-based test environment at https://github.com/cohosh/snowbox.

FAQ

Q: How does it work?

In the Tor use-case:

  1. Volunteers visit websites which host the "snowflake" proxy. (just like flashproxy)
  2. Tor clients automatically find available browser proxies via the Broker (the domain fronted signaling channel).
  3. Tor client and browser proxy establish a WebRTC peer connection.
  4. Proxy connects to some relay.
  5. Tor occurs.

More detailed information about how clients, snowflake proxies, and the Broker fit together on the way...

Q: What are the benefits of this PT compared with other PTs?

Snowflake combines the advantages of flashproxy and meek. Primarily:

  • It has the convenience of Meek, but can support magnitudes more users with negligible CDN costs. (Domain fronting is only used for brief signalling / NAT-piercing to setup the P2P WebRTC DataChannels which handle the actual traffic.)

  • Arbitrarily high numbers of volunteer proxies are possible like in flashproxy, but NATs are no longer a usability barrier - no need for manual port forwarding!

Q: Why is this called Snowflake?

It utilizes the "ICE" negotiation via WebRTC, and also involves a great abundance of ephemeral and short-lived (and special!) volunteer proxies...

More info and links

We have more documentation in the Snowflake wiki and at https://snowflake.torproject.org/.

-- Android AAR Reproducible Build Setup --

Using gomobile it is possible to build snowflake as shared libraries for all the architectures supported by Android. This is in the .gitlab-ci.yml, which runs in GitLab CI. It is also possible to run this setup in a Virtual Machine using vagrant. Just run vagrant up and it will create and provision the VM. vagrant ssh to get into the VM to use it as a development environment.

snowflake's People

Contributors

arlolra avatar bassosimone avatar blizzardplus avatar cohosh avatar cybertailor avatar dangowrt avatar eighthave avatar emmapeel2 avatar eyedeekay avatar holantonela-zz avatar jaeh avatar jakevossen5 avatar keroserene avatar max-b avatar meskio avatar nullhypothesis avatar pgerber avatar pjsier avatar shanehowearth avatar tgragnato avatar xiaokangwang avatar yinghuocho 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  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  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

snowflake's Issues

SOCKS4 failure message

Sometimes, Tor emits this:

[warn] The connection to the SOCKS4 proxy server at 127.0.0.1:$someport just failed. Make sure that the proxy server is up and running.

At which point no more handlers fire. Looking at the Tor source, this happens when SOCKS is "marked for close". This is inconvenient because then the client must be restarted for connectivity to work again.

Add support for snowflake bridges

Only snowflake bridges works on countries like China, Iran & other countries that uses China's censorship firewall, so please support it.
For example for: OnionFruit™ Connect
Thanks.

initial WebRTC + websocket browser snowflake

Try to mash the go-webrtc chat demo and flashproxy badge code to allow copy-paste signaling to establish a client-relay pair using WebRTC from client-to-browser and websocket from browser-to-relay.

Broker Failure!

Snowflake isn't working on my Mac with a broker that it used to function with ...
By changing directory to ~/snowflake/client & running the command tor -f torrc as I used to, I get an error: broker failure Unexpected error, no answer.

Full Log

Sep 23 17:26:32.734 [notice] Tor 0.4.7.13 running on Darwin with Libevent 2.1.12-stable, OpenSSL 3.1.1, Zlib 1.2.11, Liblzma N/A, Libzstd N/A and Unknown N/A as libc.
Sep 23 17:26:32.734 [notice] Tor can't help you if you use it wrong! Learn how to be safe at https://support.torproject.org/faq/staying-anonymous/
Sep 23 17:26:32.735 [notice] Read configuration file "/Users/alaa/snowflake/client/torrc_BackUp".
Sep 23 17:26:32.736 [warn] Path for DataDirectory (datadir) is relative and will resolve to /Users/alaa/snowflake/client/datadir. Is this what you wanted?
Sep 23 17:26:32.738 [notice] Opening Socks listener on 127.0.0.1:2080
Sep 23 17:26:32.739 [notice] Opened Socks listener connection (ready) on 127.0.0.1:2080
Sep 23 17:26:32.000 [warn] Cannot find maximum file descriptor, assuming: 256
Sep 23 17:26:32.000 [notice] Parsing GEOIP IPv4 file /opt/homebrew/Cellar/tor/0.4.7.13_1/share/tor/geoip.
Sep 23 17:26:32.000 [notice] Parsing GEOIP IPv6 file /opt/homebrew/Cellar/tor/0.4.7.13_1/share/tor/geoip6.
Sep 23 17:26:32.000 [notice] Bootstrapped 0% (starting): Starting
Sep 23 17:26:33.000 [notice] Starting with guard context "bridges"
Sep 23 17:26:33.000 [notice] Delaying directory fetches: No running bridges
Sep 23 17:26:34.000 [notice] Bootstrapped 1% (conn_pt): Connecting to pluggable transport
Sep 23 17:26:34.000 [notice] Bootstrapped 2% (conn_done_pt): Connected to pluggable transport
Sep 23 17:26:34.000 [notice] Bootstrapped 10% (conn_done): Connected to a relay
Sep 23 17:26:39.000 [notice] Managed proxy "./client": offer created
Sep 23 17:26:41.000 [notice] Managed proxy "./client": broker failure Unexpected error, no answer.

The contents of my torrc as if required:

UseBridges 1 
##ClientTransportPlugin obfs4 exec /usr/local/bin/obfs4proxy managed
DataDirectory datadir

ClientTransportPlugin snowflake exec ./client -log snowflake.log

Bridge snowflake 127.0.0.1:2080 2B280B23E1107BB62ABFC40DDCC8824814F80A72 fingerprint=2B280B23E1107BB62ABFC40DDCC8824814F80A72 url=https://snowflake-broker.torproject.net.global.prod.fastly.net/ front=cdn.sstatic.net ice=stun:stun.voip.blackberry.com:3478,stun:stun.altar.com.pl:3478,stun:stun.antisip.com:3478,stun:stun.bluesip.net:3478,stun:stun.dus.net:3478,stun:stun.epygi.com:3478,stun:stun.sonetel.com:3478,stun:stun.sonetel.net:3478,stun:stun.stunprotocol.org:3478,stun:stun.uls.co.za:3478,stun:stun.voipgate.com:3478,stun:stun.voys.nl:3478

SocksPort 2080

Add a LICENSE file

My contributions can be considered part of the public domain 'til this point.

Preferably something permissive like MIT or MPL-2.0

503 Service Unavailable

I keep getting,

2016/03/09 13:02:10 Sending offer via BrokerChannel...
Target URL:  https://snowflake-reg.appspot.com/ 
Front URL:   www.google.com
2016/03/09 13:02:10 BrokerChannel Response:
503 Service Unavailable

will investigate in a bit, unless you know the answer immediately.

building snowflake into a bundle of pluggable transports

We're making a lib to make using pluggable transports like this one really easy to use for Android devs. This involves building multiple projects into a single JNI _.so_library, then selectively calling a method to start the specific transport. That requires that each transport's code does not have an exported main() function. I suck at Go, so I'm open to suggestions. So I'm opening this issue to figure out how to make snowflake integratable.

Here's the project for the piece that the Android dev interfaces with:
https://github.com/guardianproject/AndroidPluggableTransportsDispatcher

Here's the project where we build all of the various Go pluggable transports into the JNI bundle used by AndroidPluggableTransportsDispatcher:
https://gitlab.com/eighthave/goptbundle

@n8fr8

Configure TURN servers for the proxy and/or client

This may require spinning up our own TURN servers somewhere.

In most cases, the public ip candidates given by STUN servers are sufficient for peers to negotiate a working p2p path. But sometimes, maybe 14% of the time [1], this isn't enough -- usually due to symmetric NAT / lack of port preservation, and a TURN relay is required as a last resort.

Also, once snowflake proxies & clients are multiplexed, perhaps the likelihood that TURN continuous to be absolutely required for every pair of peers greatly decreases and we might be fine again. More thought is needed here.

Register proxies with the broker

Get the browser snowflakes to register with the broker, and be able to generate an answers on demand.

Who did we decide is going to hold the connection open waiting for the other side? Client or proxy? (Should look that up.)

Info: List of websocket servers, DHT.

From looking at the code it feels like the foundation is domain fronted WebSocket to tor servers, but I only see one wss URL in the documentation. Every proxy needs to locate one of these wss servers, seems like a problem if there are only a few.

I haven't looked but it would ease my fears if the WebRTC network worked analogous to the ctor network, where can I even find the browser proxy source?

What about concerns that this wss to tor server allows browsers unrestricted access to the entire TCP network, breaking the walled garden websocket presumably is meant to provide?

Discussion: libp2p expansion.

I've always wanted to spin up my own p2p networks. Perhaps you don't agree that anyone should be able to share in one network with islands for each client program. I believe tor is mutually benifitial to this goal. I've studied arti and am sad that it doesn't yet support the full for protocol. It looks like there just may be enough there to leach off of tor bridges. That's not the kind of good natured application I'm interested in.

The libp2p supporters seem uninterested in anything other then a software as a service model. They are uninterested in any p2p network that could stand on it's own.

I believe snowflake is a great answer. I just looked at the broker and it's usable, but could better support the islands I dream of.

The kind of application I would build is for playing cards/chess, message boards and sharing doom demo files/high scoores. Much like with snowflake users would try and be connected all the time, but some would connect for a few hours every day.

The problem tor solves is nat traversal. It would be nice if bootstrapping was also available. At the start of each network there is only one or two nodes. libp2p solves this problem with a "global" DHT, with each program supporting this DHT even if there is only one client connecting there will be nodes running a completely different program but they will serve out the DHT with data from a host that may be offline ATM.

If snowflake tried to match up clients based on what libp2p protocalls offered, that would be hugely helpful.

I envision a future where libp2p clients expand tor DHT and network in exchange for being a rally point for begginer p2p networks.

problem with go get

hello,
thank you guys! snowflakes is just an amazing idea. i was trying to run the client but im getting this error when running go get :

# github.com/pion/webrtc ../../src/github.com/pion/webrtc/dtlstransport.go:257:4: cannot use cert.x509Cert (type *x509.Certificate) as type tls.Certificate in field value ../../src/github.com/pion/webrtc/dtlstransport.go:258:4: unknown field 'PrivateKey' in struct literal of type dtls.Config ../../src/github.com/pion/webrtc/dtlstransport.go:300:34: remoteCert.Raw undefined (type [][]byte has no field or method Raw) ../../src/github.com/pion/webrtc/dtlstransport.go:301:29: cannot use remoteCert (type [][]byte) as type *x509.Certificate in argument to t.validateFingerPrint

btw, im using macOS 10.14.6 and i installed go via brew

I want to learn moar

I hope you're having fun with WebRTC. Telephony engineering is basically the most complicated thing imaginable. It's governed by a plethora of crazy RFCs.

Because WebRTC is so complicated, I'm having trouble groking this project. Is thine intention to make Tor traffic appear as though it were WebRTC traffic when viewed over the wire?

If so, do you have a design doc? If not, please consider writing one. I would be happy to take a look. I have extensive experience with Go, WebRTC, App Engine, and CoffeeScript.

[Question] What to work on during our hackathon tomorrow?

Hi Serene! I'm Steve Phillips. I don't think we got to meet during Aaron Swartz Day but I saw you during the Tor panel. Important work you all are doing!

Speaking of which, I don't know if Mike or Ms. Lovecraft happened to mention the privacy hackathon I'm putting on tomorrow at Noisebridge, but there is interest from several people in contributing to Snowflake! What should people focus on?

If you want to label or create issues for us to work on, or if there some among the existing 15 that you want help with, let me know by tomorrow afternoon and I'll show people what to do!

Or if you want to come by to help people in person, go right ahead.

2pm-10pm tomorrow at Noisebridge: https://www.meetup.com/Cypherpunks-Write-Code/events/235899233/

Unix socket support.

I usually want to have nginx fronted proxy over Unix sockets. Otherwise there are strange fw rules for "random" port numbers.

Get 100% bootstrapping working in Go 1.6

After upgrading to 1.6, the client fails to bootstrap, and no offers/answers get exchanged. This is likely related to the underlying go-webrtc code which also needs a 1.6 fix. After setting the GODEBUG env var, signaling succeeds, but bootstrapping still fails at:
Problem bootstrapping. Stuck at 10%: Finishing handshake with directory server. (DONE; DONE; count 1; recommendation warn; host 0000000000000000000000000000000000000000 at 0.0.3.0:1)

Bootstrapping sometimes stalls at 20%

Logs:

...
Jan 09 20:41:55.000 [info] compute_weighted_bandwidths(): Empty routerlist passed in to consensus weight node selection for rule weight as guard
Jan 09 20:41:55.000 [info] should_delay_dir_fetches(): Delaying dir fetches (no running bridges known)
Jan 09 20:41:55.000 [info] compute_weighted_bandwidths(): Empty routerlist passed in to consensus weight node selection for rule weight as guard
Jan 09 20:41:55.000 [info] should_delay_dir_fetches(): Delaying dir fetches (no running bridges known)
Jan 09 20:41:56.000 [info] connection_read_proxy_handshake(): Proxy Client: connection to 0.0.3.0:1 successful
Jan 09 20:41:56.000 [info] connection_tls_continue_handshake(): Client got a v3 cert!  Moving on to v3 handshake with ciphersuite ECDHE-RSA-AES128-GCM-SHA256
Jan 09 20:41:56.000 [info] channel_tls_process_versions_cell(): Negotiated version 4 with [scrubbed]:1; Waiting for CERTS cell
Jan 09 20:41:56.000 [info] connection_or_client_learned_peer_id(): Connected to router $539F087A04D86AAB399EF4B73164601CEF36AE2C at 0.0.3.0:1 without knowing its key. Hoping for the best.
Jan 09 20:41:56.000 [notice] Learned fingerprint 539F087A04D86AAB399EF4B73164601CEF36AE2C for bridge 0.0.3.0:1 (with transport 'snowflake').
Jan 09 20:41:56.000 [info] channel_tls_process_certs_cell(): Got some good certificates from [scrubbed]:1: Authenticated it.
Jan 09 20:41:56.000 [notice] Bootstrapped 15%: Establishing an encrypted directory connection
Jan 09 20:41:56.000 [info] circuit_send_next_onion_skin(): First hop: finished sending CREATE_FAST cell to '<unnamed>'
Jan 09 20:41:56.000 [info] channel_tls_process_netinfo_cell(): Got good NETINFO cell from [scrubbed]:1; OR connection is now open, using protocol version 4. Its ID digest is 539F087A04D86AAB399EF4B73164601CEF36AE2C. Our address is apparently 127.0.0.1.
Jan 09 20:41:56.000 [info] circuit_finish_handshake(): Finished building circuit hop:
Jan 09 20:41:56.000 [info] internal circ (length 1, last hop 0000000000000000000000000000000000000000): $0000000000000000000000000000000000000000(open)
Jan 09 20:41:56.000 [info] circuit_send_next_onion_skin(): circuit built!
Jan 09 20:41:56.000 [notice] Bootstrapped 20%: Asking for networkstatus consensus
Jan 09 20:41:56.000 [info] internal circ (length 1): $0000000000000000000000000000000000000000(open)
Jan 09 20:41:56.000 [info] link_apconn_to_circ(): Looks like completed circuit to [scrubbed] doesn't allow optimistic data for connection to [scrubbed]
Jan 09 20:41:56.000 [info] connection_ap_handshake_send_begin(): Sending relay cell 1 on circ 2559939672 to begin stream 39661.
Jan 09 20:41:56.000 [info] connection_ap_handshake_send_begin(): Address/port sent, ap socket -1, n_circ_id 2559939672
Jan 09 20:41:56.000 [info] connection_edge_process_relay_cell_not_open(): 'connected' received for circid 2559939672 streamid 39661 after 0 seconds.
Jan 09 20:41:56.000 [info] internal circ (length 1): $0000000000000000000000000000000000000000(open)
Jan 09 20:41:56.000 [info] connection_edge_process_relay_cell(): -1: end cell (closed normally) for stream 39661. Removing stream.
Jan 09 20:41:56.000 [info] connection_free_(): Freeing linked Socks connection [open] with 0 bytes on inbuf, 0 on outbuf.
Jan 09 20:41:56.000 [info] connection_dir_client_reached_eof(): Received server info (size 0) from server '0.0.3.0:1'
Jan 09 20:41:56.000 [info] connection_dir_client_reached_eof(): Received http status code 404 ("Not found") from server '0.0.3.0:1' while fetching "/tor/server/authority.z". I'll try again soon.
Jan 09 20:41:56.000 [info] connection_free_(): Freeing linked Directory connection [client finished] with 0 bytes on inbuf, 0 on outbuf.
Jan 09 20:41:56.000 [info] compute_weighted_bandwidths(): Empty routerlist passed in to consensus weight node selection for rule weight as guard
Jan 09 20:41:56.000 [info] should_delay_dir_fetches(): Delaying dir fetches (no running bridges known)
Jan 09 20:41:56.000 [info] compute_weighted_bandwidths(): Empty routerlist passed in to consensus weight node selection for rule weight as guard
[repeats forever]

non deterministic test output in js proxy

in my fork:
https://github.com/jaeh/snowflake

i am facing issues running the tests, they randomly fail, output below.
feels like a race condition with some initialisation, but have not yet read through the code enough to understand where.

i had to update the npm packages to get wrtc to build on my machine,
without updates i can neither get node 8, 10, 12 nor 13 to install the packages,
updating also gets rid of all deprecation warnings though, so would be worth it anyways.

can someone with a working clone of the master please test on their machine if the updates i made trigger some bugs there that i am not aware of?

steps to reproduce my changes without downloading my fork:

copy following into proxy/package.json, overwriting the existing.

  "devDependencies": {
    "eslint": "^6.7.2",
    "jasmine": "^3.5.0"
  },
  "dependencies": {
    "cldr": "^5.5.3",
    "wrtc": "^0.4.2",
    "ws": "^7.2.0",
    "xmlhttprequest": "^1.8.0"
  } 

then npm install

edit:
the client seems to work fine.

Snowflake: Disabling Snowflake. embed.js:1075:13
Snowflake: == snowflake proxy == embed.js:1082:13
Snowflake: Disabling Snowflake. embed.js:1082:13
Snowflake: Currently not active. embed.js:1082:13
Snowflake: Starting snowflake embed.js:1082:13
Snowflake: Using snowflake:443 as Relay. embed.js:1082:13
Snowflake: Snowflake IDs: ________ embed.js:1082:13
Snowflake: Polling broker.. embed.js:1082:13

endedit

test results of five runs, abbreviated:

...................................FFF...F..
.............................FFF............
...FFF...F..................................
............................................
.......................FFFF.F...............
Full test output of five runs

first run

snowflake unit tests
Randomized with seed 89281
Started
...................................FFF...F..

Failures:
1) ProxyPair flushes data between client and relay proxies data from relay to client
  Message:
    Error: <spyOn> : could not find an object to spy upon for send()
    Usage: spyOn(<object>, <methodName>)                                                                                                                                                      
  Stack:
    Error: <spyOn> : could not find an object to spy upon for send()
    Usage: spyOn(<object>, <methodName>)
        at <Jasmine>
        at UserContext.<anonymous> (/snowflake/proxy/test/bundle.spec.js:1361:7)
        at <Jasmine>

2) ProxyPair flushes data between client and relay sends nothing with nothing to flush
  Message:
    Error: <spyOn> : could not find an object to spy upon for send()
    Usage: spyOn(<object>, <methodName>)                                                                                                                                                      
  Stack:
    Error: <spyOn> : could not find an object to spy upon for send()
    Usage: spyOn(<object>, <methodName>)
        at <Jasmine>
        at UserContext.<anonymous> (/snowflake/proxy/test/bundle.spec.js:1373:7)
        at <Jasmine>

3) ProxyPair flushes data between client and relay proxies data from client to relay
  Message:
    Error: <spyOn> : could not find an object to spy upon for send()
    Usage: spyOn(<object>, <methodName>)                                                                                                                                                      
  Stack:
    Error: <spyOn> : could not find an object to spy upon for send()
    Usage: spyOn(<object>, <methodName>)
        at <Jasmine>
        at UserContext.<anonymous> (/snowflake/proxy/test/bundle.spec.js:1349:7)
        at <Jasmine>

4) ProxyPair handles a new data channel correctly
  Message:
    Expected Object({ bufferedAmount: 0, readyState: 'open', send: Function, onopen: Function, onclose: Function, onerror: Function, binaryType: 'arraybuffer', onmessage: Function }) to be null.                                                                                                                                                                                          
  Stack:
    Error: Expected Object({ bufferedAmount: 0, readyState: 'open', send: Function, onopen: Function, onclose: Function, onerror: Function, binaryType: 'arraybuffer', onmessage: Function }) to be null.
        at <Jasmine>
        at UserContext.<anonymous> (/snowflake/proxy/test/bundle.spec.js:1311:23)
        at <Jasmine>

44 specs, 4 failures
Finished in 0.054 seconds
Randomized with seed 89281 (jasmine --random=true --seed=89281)
npm ERR! Test failed.  See above for more details.

Full test output of second run

> [email protected] test /snowflake/proxy
> node make.js test

snowflake unit tests
Randomized with seed 94904
Started

.............................FFF............

Failures:
1) ProxyPair flushes data between client and relay proxies data from relay to client
  Message:
    Error: <spyOn> : send() method does not exist
    Usage: spyOn(<object>, <methodName>)                                                                                                                                                      
  Stack:
    Error: <spyOn> : send() method does not exist
    Usage: spyOn(<object>, <methodName>)
        at <Jasmine>
        at UserContext.<anonymous> (/snowflake/proxy/test/bundle.spec.js:1361:7)
        at <Jasmine>

2) ProxyPair flushes data between client and relay sends nothing with nothing to flush
  Message:
    Error: <spyOn> : send() method does not exist
    Usage: spyOn(<object>, <methodName>)                                                                                                                                                      
  Stack:
    Error: <spyOn> : send() method does not exist
    Usage: spyOn(<object>, <methodName>)
        at <Jasmine>
        at UserContext.<anonymous> (/snowflake/proxy/test/bundle.spec.js:1373:7)
        at <Jasmine>

3) ProxyPair flushes data between client and relay proxies data from client to relay
  Message:
    Error: <spyOn> : could not find an object to spy upon for send()
    Usage: spyOn(<object>, <methodName>)                                                                                                                                                      
  Stack:
    Error: <spyOn> : could not find an object to spy upon for send()
    Usage: spyOn(<object>, <methodName>)
        at <Jasmine>
        at UserContext.<anonymous> (/snowflake/proxy/test/bundle.spec.js:1349:7)
        at <Jasmine>

44 specs, 3 failures
Finished in 0.049 seconds
Randomized with seed 94904 (jasmine --random=true --seed=94904)
npm ERR! Test failed.  See above for more details.

Full test output of third run

> [email protected] test /snowflake/proxy
> node make.js test

snowflake unit tests
Randomized with seed 27171
Started

...FFF...F..................................

Failures:
1) ProxyPair flushes data between client and relay sends nothing with nothing to flush
  Message:
    Error: <spyOn> : could not find an object to spy upon for send()
    Usage: spyOn(<object>, <methodName>)                                                                                                                                                      
  Stack:
    Error: <spyOn> : could not find an object to spy upon for send()
    Usage: spyOn(<object>, <methodName>)
        at <Jasmine>
        at UserContext.<anonymous> (/snowflake/proxy/test/bundle.spec.js:1373:7)
        at <Jasmine>

2) ProxyPair flushes data between client and relay proxies data from client to relay
  Message:
    Error: <spyOn> : could not find an object to spy upon for send()
    Usage: spyOn(<object>, <methodName>)                                                                                                                                                      
  Stack:
    Error: <spyOn> : could not find an object to spy upon for send()
    Usage: spyOn(<object>, <methodName>)
        at <Jasmine>
        at UserContext.<anonymous> (/snowflake/proxy/test/bundle.spec.js:1349:7)
        at <Jasmine>

3) ProxyPair flushes data between client and relay proxies data from relay to client
  Message:
    Error: <spyOn> : could not find an object to spy upon for send()
    Usage: spyOn(<object>, <methodName>)                                                                                                                                                      
  Stack:
    Error: <spyOn> : could not find an object to spy upon for send()
    Usage: spyOn(<object>, <methodName>)
        at <Jasmine>
        at UserContext.<anonymous> (/snowflake/proxy/test/bundle.spec.js:1362:7)
        at <Jasmine>

4) ProxyPair handles a new data channel correctly
  Message:
    Expected Object({ bufferedAmount: 0, readyState: 'open', send: Function, onopen: Function, onclose: Function, onerror: Function, binaryType: 'arraybuffer', onmessage: Function }) to be null.                                                                                                                                                                                          
  Stack:
    Error: Expected Object({ bufferedAmount: 0, readyState: 'open', send: Function, onopen: Function, onclose: Function, onerror: Function, binaryType: 'arraybuffer', onmessage: Function }) to be null.
        at <Jasmine>
        at UserContext.<anonymous> (/snowflake/proxy/test/bundle.spec.js:1311:23)
        at <Jasmine>

44 specs, 4 failures
Finished in 0.048 seconds
Randomized with seed 27171 (jasmine --random=true --seed=27171)
npm ERR! Test failed.  See above for more details.

Full test output of fourth run

j@familiar:/snowflake/proxy$ nt

> [email protected] test /snowflake/proxy
> node make.js test

snowflake unit tests
Randomized with seed 43902
Started

............................................


44 specs, 0 failures
Finished in 0.057 seconds
Randomized with seed 43902 (jasmine --random=true --seed=43902)

Full test output of fifth run

snowflake unit tests
Randomized with seed 99702
Started

.......................FFFF.F...............

Failures:
1) ProxyPair connects to the relay once datachannel opens
  Message:
    TypeError: Cannot read property 'onopen' of null
  Stack:
        at <Jasmine>
        at UserContext.<anonymous> (/snowflake/proxy/test/bundle.spec.js:1325:15)
        at <Jasmine>
        at processImmediate (internal/timers.js:439:21)

2) ProxyPair flushes data between client and relay proxies data from relay to client
  Message:
    Error: <spyOn> : could not find an object to spy upon for send()
    Usage: spyOn(<object>, <methodName>)                                                                                                                                                      
  Stack:
    Error: <spyOn> : could not find an object to spy upon for send()
    Usage: spyOn(<object>, <methodName>)
        at <Jasmine>
        at UserContext.<anonymous> (/snowflake/proxy/test/bundle.spec.js:1361:7)
        at <Jasmine>

3) ProxyPair flushes data between client and relay sends nothing with nothing to flush
  Message:
    Error: <spyOn> : could not find an object to spy upon for send()
    Usage: spyOn(<object>, <methodName>)                                                                                                                                                      
  Stack:
    Error: <spyOn> : could not find an object to spy upon for send()
    Usage: spyOn(<object>, <methodName>)
        at <Jasmine>
        at UserContext.<anonymous> (/snowflake/proxy/test/bundle.spec.js:1373:7)
        at <Jasmine>

4) ProxyPair flushes data between client and relay proxies data from client to relay
  Message:
    Error: <spyOn> : could not find an object to spy upon for send()
    Usage: spyOn(<object>, <methodName>)                                                                                                                                                      
  Stack:
    Error: <spyOn> : could not find an object to spy upon for send()
    Usage: spyOn(<object>, <methodName>)
        at <Jasmine>
        at UserContext.<anonymous> (/snowflake/proxy/test/bundle.spec.js:1349:7)
        at <Jasmine>

5) ProxyPair handles a new data channel correctly
  Message:
    Expected Object({ bufferedAmount: 0, readyState: 'open', send: Function, onopen: Function, onclose: Function, onerror: Function, binaryType: 'arraybuffer', onmessage: Function }) to be null.                                                                                                                                                                                          
  Stack:
    Error: Expected Object({ bufferedAmount: 0, readyState: 'open', send: Function, onopen: Function, onclose: Function, onerror: Function, binaryType: 'arraybuffer', onmessage: Function }) to be null.
        at <Jasmine>
        at UserContext.<anonymous> (/snowflake/proxy/test/bundle.spec.js:1311:23)
        at <Jasmine>

44 specs, 5 failures
Finished in 0.064 seconds
Randomized with seed 99702 (jasmine --random=true --seed=99702)
npm ERR! Test failed.  See above for more details.

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.