transport-tcp.js 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. "use strict";
  2. var makeChannel = require('culvert');
  3. var bodec = require('bodec');
  4. var pktLine = require('../lib/pkt-line');
  5. var wrapHandler = require('../lib/wrap-handler');
  6. module.exports = function (connect) {
  7. return function tcpTransport(path, host, port) {
  8. port = (port|0) || 9418;
  9. if (!path || !host) throw new Error("path and host are required");
  10. return function (serviceName, onError) {
  11. onData = wrapHandler(onData, onError);
  12. onDrain = wrapHandler(onDrain, onError);
  13. var socket = connect(host, port, onError);
  14. var inter = makeChannel();
  15. inter.put = pktLine.deframer(inter.put);
  16. socket.put = pktLine.framer(socket.put);
  17. var greeting = bodec.fromRaw(serviceName + " " + path + "\0host=" + host + "\0");
  18. socket.put(greeting);
  19. // Pipe socket to inter with backpressure
  20. socket.take(onData);
  21. function onData(chunk) {
  22. if (inter.put(chunk)) {
  23. socket.take(onData);
  24. }
  25. else {
  26. inter.drain(onDrain);
  27. }
  28. }
  29. function onDrain() {
  30. socket.take(onData);
  31. }
  32. return {
  33. put: socket.put,
  34. drain: socket.drain,
  35. take: inter.take
  36. };
  37. };
  38. };
  39. };