poller.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. "use strict";
  2. var __importDefault = (this && this.__importDefault) || function (mod) {
  3. return (mod && mod.__esModule) ? mod : { "default": mod };
  4. };
  5. Object.defineProperty(exports, "__esModule", { value: true });
  6. exports.Poller = exports.EVENTS = void 0;
  7. const debug_1 = __importDefault(require("debug"));
  8. const events_1 = require("events");
  9. const errors_1 = require("./errors");
  10. const serialport_bindings_1 = require("./serialport-bindings");
  11. const { Poller: PollerBindings } = serialport_bindings_1.binding;
  12. const logger = (0, debug_1.default)('serialport/bindings-cpp/poller');
  13. exports.EVENTS = {
  14. UV_READABLE: 0b0001,
  15. UV_WRITABLE: 0b0010,
  16. UV_DISCONNECT: 0b0100,
  17. };
  18. function handleEvent(error, eventFlag) {
  19. if (error) {
  20. logger('error', error);
  21. this.emit('readable', error);
  22. this.emit('writable', error);
  23. this.emit('disconnect', error);
  24. return;
  25. }
  26. if (eventFlag & exports.EVENTS.UV_READABLE) {
  27. logger('received "readable"');
  28. this.emit('readable', null);
  29. }
  30. if (eventFlag & exports.EVENTS.UV_WRITABLE) {
  31. logger('received "writable"');
  32. this.emit('writable', null);
  33. }
  34. if (eventFlag & exports.EVENTS.UV_DISCONNECT) {
  35. logger('received "disconnect"');
  36. this.emit('disconnect', null);
  37. }
  38. }
  39. /**
  40. * Polls unix systems for readable or writable states of a file or serialport
  41. */
  42. class Poller extends events_1.EventEmitter {
  43. constructor(fd, FDPoller = PollerBindings) {
  44. logger('Creating poller');
  45. super();
  46. this.poller = new FDPoller(fd, handleEvent.bind(this));
  47. }
  48. /**
  49. * Wait for the next event to occur
  50. * @param {string} event ('readable'|'writable'|'disconnect')
  51. * @returns {Poller} returns itself
  52. */
  53. once(event, callback) {
  54. switch (event) {
  55. case 'readable':
  56. this.poll(exports.EVENTS.UV_READABLE);
  57. break;
  58. case 'writable':
  59. this.poll(exports.EVENTS.UV_WRITABLE);
  60. break;
  61. case 'disconnect':
  62. this.poll(exports.EVENTS.UV_DISCONNECT);
  63. break;
  64. }
  65. return super.once(event, callback);
  66. }
  67. /**
  68. * Ask the bindings to listen for an event, it is recommend to use `.once()` for easy use
  69. * @param {EVENTS} eventFlag polls for an event or group of events based upon a flag.
  70. */
  71. poll(eventFlag = 0) {
  72. if (eventFlag & exports.EVENTS.UV_READABLE) {
  73. logger('Polling for "readable"');
  74. }
  75. if (eventFlag & exports.EVENTS.UV_WRITABLE) {
  76. logger('Polling for "writable"');
  77. }
  78. if (eventFlag & exports.EVENTS.UV_DISCONNECT) {
  79. logger('Polling for "disconnect"');
  80. }
  81. this.poller.poll(eventFlag);
  82. }
  83. /**
  84. * Stop listening for events and cancel all outstanding listening with an error
  85. */
  86. stop() {
  87. logger('Stopping poller');
  88. this.poller.stop();
  89. this.emitCanceled();
  90. }
  91. destroy() {
  92. logger('Destroying poller');
  93. this.poller.destroy();
  94. this.emitCanceled();
  95. }
  96. emitCanceled() {
  97. const err = new errors_1.BindingsError('Canceled', { canceled: true });
  98. this.emit('readable', err);
  99. this.emit('writable', err);
  100. this.emit('disconnect', err);
  101. }
  102. }
  103. exports.Poller = Poller;