UNPKG

2.14 kBJavaScriptView Raw
1/*
2 eslint-disable
3 no-warning-comments,
4 no-underscore-dangle,
5*/
6'use strict';
7
8var Gun = require('../../gun');
9var Socket = require('./Peer');
10var Pool = require('./Pool');
11
12// Maps URLs to sockets.
13// Shared between all gun instances.
14var sockets = Pool();
15var sid = Gun.text.random();
16
17/**
18 * Take a map of URLs pointing to options and ensure the
19 * urls are using the WS protocol.
20 * @param {Object} peers - Any object with URLs as keys.
21 * @return {Object} - Object with normalized URL keys.
22 */
23function normalizeURLs (peers) {
24 var formatted = {};
25
26 Object.keys(peers).forEach(function (url) {
27 var options = peers[url];
28 var id = Socket.formatURL(url);
29 formatted[id] = options;
30 });
31
32 return formatted;
33}
34
35/**
36 * Turns a map of URLs into a socket pool.
37 * @param {Object} peers - Any object with URLs as keys.
38 * @return {Pool} - A pool of sockets corresponding to the URLs.
39 */
40function getSocketSubset (peers) {
41 var urls = normalizeURLs(peers);
42
43 return sockets.filter(function (socket) {
44 return urls.hasOwnProperty(socket.url);
45 });
46}
47
48Gun.on('out', function (ctx) {
49 this.to.next(ctx);
50 var gun = ctx.gun;
51 var opt = ctx.opt || {};
52 var peers = opt.peers || gun.back('opt.peers');
53 var headers = opt.headers || gun.back('opt.headers') || {};
54
55 if (!peers) {
56 return;
57 }
58
59 var subset = getSocketSubset(peers);
60
61 headers['gun-sid'] = sid;
62 subset.send({
63 headers: headers,
64 body: ctx,
65 });
66});
67
68// Open any new sockets listed,
69// adding them to the global pool.
70Gun.on('opt', function (context) {
71 var gun = context.gun;
72 var root = gun.back(Infinity);
73
74 var peers = gun.back('opt.peers') || {};
75
76 Gun.obj.map(peers, function (options, url) {
77 if (sockets[url]) {
78 return;
79 }
80 if (!options.wsc){ options.wsc = gun.back('opt.wsc') || { protocols:null }; }
81
82 var socket = Socket(url, options);
83 sockets.add(url, socket);
84
85 socket.on('message', function (msg) {
86 var request;
87
88 try {
89 request = JSON.parse(msg);
90 } catch (error) {
91 return;
92 }
93
94 // Validate the request.
95 if (!request || !request.body) {
96 return;
97 }
98
99 root.on('in', request.body);
100 });
101 });
102 this.to.next(context);
103});