unix-write.js 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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.unixWrite = void 0;
  7. const fs_1 = require("fs");
  8. const debug_1 = __importDefault(require("debug"));
  9. const util_1 = require("util");
  10. const logger = (0, debug_1.default)('serialport/bindings-cpp/unixWrite');
  11. const writeAsync = (0, util_1.promisify)(fs_1.write);
  12. const writable = (binding) => {
  13. return new Promise((resolve, reject) => {
  14. binding.poller.once('writable', err => (err ? reject(err) : resolve()));
  15. });
  16. };
  17. const unixWrite = async ({ binding, buffer, offset = 0, fsWriteAsync = writeAsync }) => {
  18. const bytesToWrite = buffer.length - offset;
  19. logger('Starting write', buffer.length, 'bytes offset', offset, 'bytesToWrite', bytesToWrite);
  20. if (!binding.isOpen || !binding.fd) {
  21. throw new Error('Port is not open');
  22. }
  23. try {
  24. const { bytesWritten } = await fsWriteAsync(binding.fd, buffer, offset, bytesToWrite);
  25. logger('write returned: wrote', bytesWritten, 'bytes');
  26. if (bytesWritten + offset < buffer.length) {
  27. if (!binding.isOpen) {
  28. throw new Error('Port is not open');
  29. }
  30. return (0, exports.unixWrite)({ binding, buffer, offset: bytesWritten + offset, fsWriteAsync });
  31. }
  32. logger('Finished writing', bytesWritten + offset, 'bytes');
  33. }
  34. catch (err) {
  35. logger('write errored', err);
  36. if (err.code === 'EAGAIN' || err.code === 'EWOULDBLOCK' || err.code === 'EINTR') {
  37. if (!binding.isOpen) {
  38. throw new Error('Port is not open');
  39. }
  40. logger('waiting for writable because of code:', err.code);
  41. await writable(binding);
  42. return (0, exports.unixWrite)({ binding, buffer, offset, fsWriteAsync });
  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. logger('error', err);
  53. throw err;
  54. }
  55. };
  56. exports.unixWrite = unixWrite;