unix-read.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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.unixRead = void 0;
  7. const util_1 = require("util");
  8. const fs_1 = require("fs");
  9. const errors_1 = require("./errors");
  10. const debug_1 = __importDefault(require("debug"));
  11. const logger = (0, debug_1.default)('serialport/bindings-cpp/unixRead');
  12. const readAsync = (0, util_1.promisify)(fs_1.read);
  13. const readable = (binding) => {
  14. return new Promise((resolve, reject) => {
  15. if (!binding.poller) {
  16. throw new Error('No poller on bindings');
  17. }
  18. binding.poller.once('readable', err => (err ? reject(err) : resolve()));
  19. });
  20. };
  21. const unixRead = async ({ binding, buffer, offset, length, fsReadAsync = readAsync, }) => {
  22. logger('Starting read');
  23. if (!binding.isOpen || !binding.fd) {
  24. throw new errors_1.BindingsError('Port is not open', { canceled: true });
  25. }
  26. try {
  27. const { bytesRead } = await fsReadAsync(binding.fd, buffer, offset, length, null);
  28. if (bytesRead === 0) {
  29. return (0, exports.unixRead)({ binding, buffer, offset, length, fsReadAsync });
  30. }
  31. logger('Finished read', bytesRead, 'bytes');
  32. return { bytesRead, buffer };
  33. }
  34. catch (err) {
  35. logger('read error', err);
  36. if (err.code === 'EAGAIN' || err.code === 'EWOULDBLOCK' || err.code === 'EINTR') {
  37. if (!binding.isOpen) {
  38. throw new errors_1.BindingsError('Port is not open', { canceled: true });
  39. }
  40. logger('waiting for readable because of code:', err.code);
  41. await readable(binding);
  42. return (0, exports.unixRead)({ binding, buffer, offset, length, fsReadAsync });
  43. }
  44. const disconnectError = err.code === 'EBADF' || // Bad file number means we got closed
  45. err.code === 'ENXIO' || // No such device or address probably usb disconnect
  46. err.code === 'UNKNOWN' ||
  47. err.errno === -1; // generic error
  48. if (disconnectError) {
  49. err.disconnect = true;
  50. logger('disconnecting', err);
  51. }
  52. throw err;
  53. }
  54. };
  55. exports.unixRead = unixRead;