UNPKG

faye

Version:

Simple pub/sub messaging for the web

91 lines (71 loc) 2.42 kB
'use strict'; module.exports = { isURI: function(uri) { return uri && uri.protocol && uri.host && uri.path; }, isSameOrigin: function(uri) { return uri.protocol === location.protocol && uri.hostname === location.hostname && uri.port === location.port; }, parse: function(url) { if (typeof url !== 'string') return url; var uri = {}, parts, query, pairs, i, n, data; var consume = function(name, pattern) { url = url.replace(pattern, function(match) { uri[name] = match; return ''; }); uri[name] = uri[name] || ''; }; consume('protocol', /^[a-z]+\:/i); consume('host', /^\/\/[^\/\?#]+/); if (!/^\//.test(url) && !uri.host) url = location.pathname.replace(/[^\/]*$/, '') + url; consume('pathname', /^[^\?#]*/); consume('search', /^\?[^#]*/); consume('hash', /^#.*/); uri.protocol = uri.protocol || location.protocol; if (uri.host) { uri.host = uri.host.substr(2); if (/@/.test(uri.host)) { uri.auth = uri.host.split('@')[0]; uri.host = uri.host.split('@')[1]; } parts = uri.host.match(/^\[([^\]]+)\]|^[^:]+/); uri.hostname = parts[1] || parts[0]; uri.port = (uri.host.match(/:(\d+)$/) || [])[1] || ''; } else { uri.host = location.host; uri.hostname = location.hostname; uri.port = location.port; } uri.pathname = uri.pathname || '/'; uri.path = uri.pathname + uri.search; query = uri.search.replace(/^\?/, ''); pairs = query ? query.split('&') : []; data = {}; for (i = 0, n = pairs.length; i < n; i++) { parts = pairs[i].split('='); data[decodeURIComponent(parts[0] || '')] = decodeURIComponent(parts[1] || ''); } uri.query = data; uri.href = this.stringify(uri); return uri; }, stringify: function(uri) { var auth = uri.auth ? uri.auth + '@' : '', string = uri.protocol + '//' + auth + uri.host; string += uri.pathname + this.queryString(uri.query) + (uri.hash || ''); return string; }, queryString: function(query) { var pairs = []; for (var key in query) { if (!query.hasOwnProperty(key)) continue; pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(query[key])); } if (pairs.length === 0) return ''; return '?' + pairs.join('&'); } };