Skip to content

Commit ec0dd3e

Browse files
author
pemrouz
committed
refactor: simplify send/receive
1 parent 7dd6abe commit ec0dd3e

File tree

3 files changed

+761
-876
lines changed

3 files changed

+761
-876
lines changed

dist/index.js

Lines changed: 122 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,24 @@
33
Object.defineProperty(exports, "__esModule", {
44
value: true
55
});
6-
7-
/* istanbul ignore next */
8-
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
9-
106
exports.default = sync;
117

128
var _identity = require('utilise/identity');
139

1410
var _identity2 = _interopRequireDefault(_identity);
1511

12+
var _promise = require('utilise/promise');
13+
14+
var _promise2 = _interopRequireDefault(_promise);
15+
1616
var _values = require('utilise/values');
1717

1818
var _values2 = _interopRequireDefault(_values);
1919

20+
var _extend = require('utilise/extend');
21+
22+
var _extend2 = _interopRequireDefault(_extend);
23+
2024
var _header = require('utilise/header');
2125

2226
var _header2 = _interopRequireDefault(_header);
@@ -59,6 +63,8 @@ var _is = require('utilise/is');
5963

6064
var _is2 = _interopRequireDefault(_is);
6165

66+
var _to = require('utilise/to');
67+
6268
/* istanbul ignore next */
6369
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
6470

@@ -69,138 +75,141 @@ function sync(ripple, server) {
6975
log('creating');
7076

7177
/* istanbul ignore next */
72-
if (!_client2.default && !server) return;
78+
if (!_client2.default && !server) return ripple;
7379
/* istanbul ignore next */
7480
if (!_client2.default) ripple.to = clean(ripple.to), (0, _values2.default)(ripple.types).map(function (type) {
7581
return type.parse = headers(ripple)(type.parse);
7682
});
7783

78-
ripple.stream = stream(ripple);
79-
ripple.respond = respond(ripple);
8084
ripple.io = io(server);
81-
ripple.on('change.stream', ripple.stream()); // both - broadcast change to everyone
82-
ripple.io.on('change', consume(ripple)); // client - receive change
83-
ripple.io.on('response', response(ripple)); // client - receive response
84-
ripple.io.on('connection', function (s) {
85-
return s.on('change', consume(ripple));
86-
}); // server - receive change
87-
ripple.io.on('connection', function (s) {
88-
return ripple.stream(s)();
89-
}); // server - send all resources to new client
90-
ripple.io.use(setIP);
85+
ripple.io.use(ip);
86+
ripple.req = send(ripple)(ripple);
87+
/* istanbul ignore next */
88+
ripple.send = _client2.default ? send(ripple)(ripple.io) : send(ripple);
89+
ripple.on('change.send', broadcast(ripple));
90+
ripple.io.on('change', consume(ripple));
91+
ripple.io.on('connection', connected(ripple));
9192
return ripple;
9293
}
9394

94-
var respond = function respond(ripple) {
95-
return function (socket, name, time) {
96-
return function (reply) {
97-
socket.emit('response', [name, time, reply]);
98-
};
95+
var connected = function connected(ripple) {
96+
return function (socket) {
97+
log('connected'.green, (0, _str2.default)(socket.ip).grey);
98+
socket.on('change', consume(ripple));
99+
ripple.send(socket)();
99100
};
100101
};
101102

102-
var response = function response(ripple) {
103-
return function (_ref) {
103+
var broadcast = function broadcast(ripple) {
104+
return function (name, change) {
104105
/* istanbul ignore next */
105-
var _ref2 = _slicedToArray(_ref, 3);
106+
(_client2.default ? ripple.send : ripple.send())((0, _extend2.default)({ name: name })(change));
107+
};
108+
};
106109

107-
var name = _ref2[0];
108-
var time = _ref2[1];
109-
var reply = _ref2[2];
110+
var normalize = function normalize(ripple) {
111+
var next = arguments.length <= 1 || arguments[1] === undefined ? _identity2.default : arguments[1];
112+
return function (name, type, value) {
113+
var req = _is2.default.obj(name) ? name : { name: name, type: type, value: value },
114+
resource = ripple.resources[req.name];
115+
116+
if (!req.name) return next((0, _values2.default)(ripple.resources).map(normalize(ripple)));
117+
118+
if (!resource) return Promise.resolve([404, err('cannot find ' + req.name)]);
119+
120+
if (!req.type) req = {
121+
name: req.name,
122+
type: 'update',
123+
headers: resource.headers,
124+
value: resource.body,
125+
time: now(resource)
126+
};
110127

111-
ripple.resources[name].body.emit('response._' + time, reply);
128+
if (req.type == 'update' && !req.key) req.headers = resource.headers;
129+
130+
return next(req);
112131
};
113132
};
114133

115-
// send diff to all or some sockets
116-
var stream = function stream(ripple) {
117-
return function (sockets) {
118-
return function (name, change) {
119-
if (!name) return (0, _values2.default)(ripple.resources).map(function (d) {
120-
return stream(ripple)(sockets)(d.name);
121-
});
122-
134+
// send all or some req, to all or some sockets
135+
var send = function send(ripple) {
136+
var l = arguments.length <= 1 || arguments[1] === undefined ? log : arguments[1];
137+
return function (who) {
138+
return normalize(ripple, function (req) {
139+
var count = function count(sent) {
140+
return (0, _str2.default)(sent.length).green.bold + '/' + (0, _str2.default)(everyone.length).green;
141+
},
142+
all = function all(d) {
143+
return req.length && log('send'.grey, count(sockets), 'all'.bold, ('(' + req.length + ')').grey);
144+
},
123145
/* istanbul ignore next */
124-
var everyone = _client2.default ? [ripple.io] : (0, _values2.default)(ripple.io.of('/').sockets),
125-
log = count(everyone.length, name),
126-
res = ripple.resources[name],
127-
send = to(ripple, res, change);
146+
everyone = _client2.default ? [ripple.io] : (0, _values2.default)(ripple.io.of('/').sockets),
147+
sockets = _is2.default.arr(who) ? who : _is2.default.str(who) ? everyone.filter((0, _by2.default)('sessionID', who)) : !who ? everyone : [who],
148+
/* istanbul ignore next */
149+
promises = _is2.default.arr(req) ? (all(), req.map(send(ripple, l = _noop2.default)(sockets))) : sockets.map(function (s) {
150+
return to(ripple, req, s);
151+
}).filter(Boolean);
128152

129-
return !res ? log('no resource', name) : _is2.default.str(sockets) ? (log(everyone.filter((0, _by2.default)('sessionID', sockets)).map(send)), ripple) : !sockets ? (log(everyone.map(send)), ripple) : (log(send(sockets)), ripple);
130-
};
153+
if (promises.length) l('send'.grey, count(promises), req.name);
154+
return Promise.all(promises);
155+
});
131156
};
132157
};
133158

134159
// outgoing transforms
135-
var to = function to(ripple, res, change) {
136-
return function (socket) {
137-
if ((0, _header2.default)('silent', socket)(res)) return delete res.headers.silent, false;
138-
139-
var xres = (0, _header2.default)('to')(res),
140-
xtype = type(ripple)(res).to,
141-
xall = ripple.to,
142-
body,
143-
rep,
144-
out;
145-
146-
body = res.body;
147-
if (xres) {
148-
if (!(out = xres.call(socket, res, change))) return false;
149-
if (out !== true) {
150-
change = false, body = out;
151-
}
152-
}
160+
var to = function to(ripple, req, socket, resource) {
161+
if ((0, _header2.default)('silent', socket)(resource = ripple.resources[req.name])) return delete resource.headers.silent, false;
153162

154-
rep = { name: res.name, body: body, headers: res.headers };
155-
if (xtype) {
156-
if (!(out = xtype.call(socket, rep, change))) return false;
157-
if (out !== true) change = false, rep = out;
158-
}
163+
var nametype = '(' + req.name + ', ' + req.type + ')',
164+
xres = (0, _header2.default)('to')(resource) || _identity2.default,
165+
xtyp = type(ripple)(resource).to || _identity2.default,
166+
xall = ripple.to || _identity2.default,
167+
p = (0, _promise2.default)();
159168

160-
if (xall) {
161-
if (!(out = xall.call(socket, rep, change))) return false;
162-
if (out !== true) change = false, rep = out;
163-
}
169+
req = (0, _extend2.default)({ socket: socket })(req);
170+
if (!(req = xres(req))) return false;
171+
if (!(req = xtyp(req))) return false;
172+
if (!(req = xall(req))) return false;
173+
delete req.socket;
164174

165-
return socket.emit('change', change ? [res.name, change] : [res.name, false, rep]), true;
166-
};
175+
socket == ripple ? consume(ripple)(req, res) : socket.emit('change', req, res);
176+
177+
return p;
178+
179+
function res() {
180+
deb('ack'.grey, nametype, (0, _str2.default)(socket.ip).grey);
181+
p.resolve.call(ripple, (0, _to.arr)(arguments));
182+
}
167183
};
168184

169185
// incoming transforms
170186
var consume = function consume(ripple) {
171-
return function (_ref3, ack) {
187+
return function (req) {
172188
/* istanbul ignore next */
173-
var _ref4 = _slicedToArray(_ref3, 3);
174-
175-
var name = _ref4[0];
176-
var change = _ref4[1];
177-
var _ref4$ = _ref4[2];
178-
var req = _ref4$ === undefined ? {} : _ref4$;
179-
180-
log('receiving', name);
181-
182-
var res = ripple.resources[name],
183-
xall = ripple.from,
184-
xtype = type(ripple)(res).from || type(ripple)(req).from // is latter needed?
185-
,
186-
xres = (0, _header2.default)('from')(res),
187-
next = (0, _set2.default)(change),
188-
silent = silence(this),
189-
respond = ack || ripple.respond(this, name, change.time);
190-
191-
return xall && !xall.call(this, req, change, respond) ? debug('skip all', name) // rejected - by xall
192-
: xtype && !xtype.call(this, req, change, respond) ? debug('skip type', name) // rejected - by xtype
193-
: xres && !xres.call(this, req, change, respond) ? debug('skip res', name) // rejected - by xres
194-
: !change ? ripple(silent(req)) // accept - replace (new)
195-
: !change.key ? ripple(silent({ name: name, body: change.value })) // accept - replace at root
196-
: (silent(res), next(res.body)); // accept - deep change
189+
var res = arguments.length <= 1 || arguments[1] === undefined ? _noop2.default : arguments[1];
190+
191+
var nametype = '(' + req.name + ', ' + req.type + ')',
192+
resource = ripple.resources[req.name],
193+
silent = silence(req.socket = this),
194+
xres = (0, _header2.default)('from')(resource) || _identity2.default,
195+
xtyp = type(ripple)(resource).from || _identity2.default,
196+
xall = ripple.from || _identity2.default;
197+
198+
log('recv'.grey, nametype);
199+
try {
200+
!req.name ? res(404, err('not found'.red, req.name)) : !(req = xall(req, res)) ? deb('skip', 'global', nametype) : !(req = xtyp(req, res)) ? deb('skip', 'type', nametype) : !(req = xres(req, res)) ? deb('skip', 'resource', nametype) : !req.key && req.type == 'update' ? (ripple(silent(body(req))), res(200, deb('ok ' + nametype))) : isStandardVerb(req.type) ? ((0, _set2.default)(req)(silent(resource).body), res(200, deb('ok ' + nametype, _key2.default.grey))) : !isStandardVerb(req.type) ? res(405, err('method not allowed', nametype)) : res(400, err('cannot process', nametype));
201+
} catch (e) {
202+
res(e.status || 500, err(e.message, nametype, '\n', e.stack));
203+
}
197204
};
198205
};
199206

200-
var count = function count(total, name) {
201-
return function (tally) {
202-
return debug((0, _str2.default)((_is2.default.arr(tally) ? tally : [1]).filter(Boolean).length).green.bold + '/' + (0, _str2.default)(total).green, 'sending', name);
203-
};
207+
var body = function body(_ref) {
208+
var name = _ref.name;
209+
var _body = _ref.body;
210+
var value = _ref.value;
211+
var headers = _ref.headers;
212+
return { name: name, headers: headers, body: value };
204213
};
205214

206215
var headers = function headers(ripple) {
@@ -224,40 +233,41 @@ var io = function io(opts) {
224233
return r;
225234
};
226235

227-
var setIP = function setIP(socket, next) {
236+
var ip = function ip(socket, next) {
228237
socket.ip = socket.request.headers['x-forwarded-for'] || socket.request.connection.remoteAddress;
229238
next();
230239
};
231240

232241
var clean = function clean(next) {
233-
return function (_ref5, change) {
234-
var name = _ref5.name;
235-
var body = _ref5.body;
236-
var headers = _ref5.headers;
237-
238-
if (change) return next ? next.apply(this, arguments) : true;
242+
return function (req, res) {
243+
if (!req.headers || !req.headers.silent) return (next || _identity2.default)(req, res);
239244

240245
var stripped = {};
241246

242-
(0, _keys2.default)(headers).filter((0, _not2.default)((0, _is2.default)('silent'))).map(function (header) {
243-
return stripped[header] = headers[header];
247+
(0, _keys2.default)(req.headers).filter((0, _not2.default)((0, _is2.default)('silent'))).map(function (header) {
248+
return stripped[header] = req.headers[header];
244249
});
245250

246-
return (next || _identity2.default).apply(this, [{ name: name, body: body, headers: stripped }, change]);
251+
req.headers = stripped;
252+
return (next || _identity2.default)(req, res);
247253
};
248254
};
249255

250256
var type = function type(ripple) {
251257
return function (res) {
252258
return ripple.types[(0, _header2.default)('content-type')(res)] || {};
253259
};
260+
},
261+
now = function now(d, t) {
262+
return t = (0, _key2.default)('body.log.length')(d), _is2.default.num(t) ? t - 1 : t;
254263
},
255264
silence = function silence(socket) {
256265
return function (res) {
257266
return (0, _key2.default)('headers.silent', socket)(res);
258267
};
259268
},
269+
isStandardVerb = _is2.default.in(['update', 'add', 'remove']),
260270
log = require('utilise/log')('[ri/sync]'),
261271
err = require('utilise/err')('[ri/sync]'),
262272
/* istanbul ignore next */
263-
debug = _noop2.default;
273+
deb = (!_client2.default && process.env.DEBUG || '').split(',').some((0, _is2.default)('[ri/sync]')) ? log : _identity2.default;

0 commit comments

Comments
 (0)