mirror of
https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake.git
synced 2025-10-14 05:11:19 -04:00
Some files were omitted in the .eslintignore, left as an exercise to the reader. We probably want to reduce amount of globals overall and use proper es modules.
66 lines
1.7 KiB
JavaScript
66 lines
1.7 KiB
JavaScript
/* global Query */
|
|
|
|
/*
|
|
Only websocket-specific stuff.
|
|
*/
|
|
|
|
class WS {
|
|
|
|
// Build an escaped URL string from unescaped components. Only scheme and host
|
|
// are required. See RFC 3986, section 3.
|
|
static buildUrl(scheme, host, port, path, params) {
|
|
var parts;
|
|
parts = [];
|
|
parts.push(encodeURIComponent(scheme));
|
|
parts.push('://');
|
|
// If it contains a colon but no square brackets, treat it as IPv6.
|
|
if (host.match(/:/) && !host.match(/[[\]]/)) {
|
|
parts.push('[');
|
|
parts.push(host);
|
|
parts.push(']');
|
|
} else {
|
|
parts.push(encodeURIComponent(host));
|
|
}
|
|
if (void 0 !== port && this.DEFAULT_PORTS[scheme] !== port) {
|
|
parts.push(':');
|
|
parts.push(encodeURIComponent(port.toString()));
|
|
}
|
|
if (void 0 !== path && '' !== path) {
|
|
if (!path.match(/^\//)) {
|
|
path = '/' + path;
|
|
}
|
|
path = path.replace(/[^/]+/, function(m) {
|
|
return encodeURIComponent(m);
|
|
});
|
|
parts.push(path);
|
|
}
|
|
if (void 0 !== params) {
|
|
parts.push('?');
|
|
parts.push(Query.buildString(params));
|
|
}
|
|
return parts.join('');
|
|
}
|
|
|
|
static makeWebsocket(addr, params) {
|
|
var url, ws, wsProtocol;
|
|
wsProtocol = this.WSS_ENABLED ? 'wss' : 'ws';
|
|
url = this.buildUrl(wsProtocol, addr.host, addr.port, '/', params);
|
|
ws = new WebSocket(url);
|
|
/*
|
|
'User agents can use this as a hint for how to handle incoming binary data:
|
|
if the attribute is set to 'blob', it is safe to spool it to disk, and if it
|
|
is set to 'arraybuffer', it is likely more efficient to keep the data in
|
|
memory.'
|
|
*/
|
|
ws.binaryType = 'arraybuffer';
|
|
return ws;
|
|
}
|
|
|
|
}
|
|
|
|
WS.WSS_ENABLED = true;
|
|
|
|
WS.DEFAULT_PORTS = {
|
|
http: 80,
|
|
https: 443
|
|
};
|