123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- module.exports = EntryWriter
- var tar = require("../tar.js")
- , TarHeader = require("./header.js")
- , Entry = require("./entry.js")
- , inherits = require("inherits")
- , BlockStream = require("block-stream")
- , ExtendedHeaderWriter
- , Stream = require("stream").Stream
- , EOF = {}
- inherits(EntryWriter, Stream)
- function EntryWriter (props) {
- var me = this
- if (!(me instanceof EntryWriter)) {
- return new EntryWriter(props)
- }
- Stream.apply(this)
- me.writable = true
- me.readable = true
- me._stream = new BlockStream(512)
- me._stream.on("data", function (c) {
- me.emit("data", c)
- })
- me._stream.on("drain", function () {
- me.emit("drain")
- })
- me._stream.on("end", function () {
- me.emit("end")
- me.emit("close")
- })
- me.props = props
- if (props.type === "Directory") {
- props.size = 0
- }
- props.ustar = "ustar\0"
- props.ustarver = "00"
- me.path = props.path
- me._buffer = []
- me._didHeader = false
- me._meta = false
- me.on("pipe", function () {
- me._process()
- })
- }
- EntryWriter.prototype.write = function (c) {
- // console.error(".. ew write")
- if (this._ended) return this.emit("error", new Error("write after end"))
- this._buffer.push(c)
- this._process()
- this._needDrain = this._buffer.length > 0
- return !this._needDrain
- }
- EntryWriter.prototype.end = function (c) {
- // console.error(".. ew end")
- if (c) this._buffer.push(c)
- this._buffer.push(EOF)
- this._ended = true
- this._process()
- this._needDrain = this._buffer.length > 0
- }
- EntryWriter.prototype.pause = function () {
- // console.error(".. ew pause")
- this._paused = true
- this.emit("pause")
- }
- EntryWriter.prototype.resume = function () {
- // console.error(".. ew resume")
- this._paused = false
- this.emit("resume")
- this._process()
- }
- EntryWriter.prototype.add = function (entry) {
- // console.error(".. ew add")
- if (!this.parent) return this.emit("error", new Error("no parent"))
- // make sure that the _header and such is emitted, and clear out
- // the _currentEntry link on the parent.
- if (!this._ended) this.end()
- return this.parent.add(entry)
- }
- EntryWriter.prototype._header = function () {
- // console.error(".. ew header")
- if (this._didHeader) return
- this._didHeader = true
- var headerBlock = TarHeader.encode(this.props)
- if (this.props.needExtended && !this._meta) {
- var me = this
- ExtendedHeaderWriter = ExtendedHeaderWriter ||
- require("./extended-header-writer.js")
- ExtendedHeaderWriter(this.props)
- .on("data", function (c) {
- me.emit("data", c)
- })
- .on("error", function (er) {
- me.emit("error", er)
- })
- .end()
- }
- // console.error(".. .. ew headerBlock emitting")
- this.emit("data", headerBlock)
- this.emit("header")
- }
- EntryWriter.prototype._process = function () {
- // console.error(".. .. ew process")
- if (!this._didHeader && !this._meta) {
- this._header()
- }
- if (this._paused || this._processing) {
- // console.error(".. .. .. paused=%j, processing=%j", this._paused, this._processing)
- return
- }
- this._processing = true
- var buf = this._buffer
- for (var i = 0; i < buf.length; i ++) {
- // console.error(".. .. .. i=%d", i)
- var c = buf[i]
- if (c === EOF) this._stream.end()
- else this._stream.write(c)
- if (this._paused) {
- // console.error(".. .. .. paused mid-emission")
- this._processing = false
- if (i < buf.length) {
- this._needDrain = true
- this._buffer = buf.slice(i + 1)
- }
- return
- }
- }
- // console.error(".. .. .. emitted")
- this._buffer.length = 0
- this._processing = false
- // console.error(".. .. .. emitting drain")
- this.emit("drain")
- }
- EntryWriter.prototype.destroy = function () {}
|