proxy-reader.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. // A reader for when we don't yet know what kind of thing
  2. // the thing is.
  3. module.exports = ProxyReader
  4. var Reader = require("./reader.js")
  5. , getType = require("./get-type.js")
  6. , inherits = require("inherits")
  7. , fs = require("graceful-fs")
  8. inherits(ProxyReader, Reader)
  9. function ProxyReader (props) {
  10. var me = this
  11. if (!(me instanceof ProxyReader)) throw new Error(
  12. "ProxyReader must be called as constructor.")
  13. me.props = props
  14. me._buffer = []
  15. me.ready = false
  16. Reader.call(me, props)
  17. }
  18. ProxyReader.prototype._stat = function () {
  19. var me = this
  20. , props = me.props
  21. // stat the thing to see what the proxy should be.
  22. , stat = props.follow ? "stat" : "lstat"
  23. fs[stat](props.path, function (er, current) {
  24. var type
  25. if (er || !current) {
  26. type = "File"
  27. } else {
  28. type = getType(current)
  29. }
  30. props[type] = true
  31. props.type = me.type = type
  32. me._old = current
  33. me._addProxy(Reader(props, current))
  34. })
  35. }
  36. ProxyReader.prototype._addProxy = function (proxy) {
  37. var me = this
  38. if (me._proxyTarget) {
  39. return me.error("proxy already set")
  40. }
  41. me._proxyTarget = proxy
  42. proxy._proxy = me
  43. ; [ "error"
  44. , "data"
  45. , "end"
  46. , "close"
  47. , "linkpath"
  48. , "entry"
  49. , "entryEnd"
  50. , "child"
  51. , "childEnd"
  52. , "warn"
  53. , "stat"
  54. ].forEach(function (ev) {
  55. // console.error("~~ proxy event", ev, me.path)
  56. proxy.on(ev, me.emit.bind(me, ev))
  57. })
  58. me.emit("proxy", proxy)
  59. proxy.on("ready", function () {
  60. // console.error("~~ proxy is ready!", me.path)
  61. me.ready = true
  62. me.emit("ready")
  63. })
  64. var calls = me._buffer
  65. me._buffer.length = 0
  66. calls.forEach(function (c) {
  67. proxy[c[0]].apply(proxy, c[1])
  68. })
  69. }
  70. ProxyReader.prototype.pause = function () {
  71. return this._proxyTarget ? this._proxyTarget.pause() : false
  72. }
  73. ProxyReader.prototype.resume = function () {
  74. return this._proxyTarget ? this._proxyTarget.resume() : false
  75. }