|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- are-we-there-yet
- ----------------
-
- Track complex hiearchies of asynchronous task completion statuses. This is
- intended to give you a way of recording and reporting the progress of the big
- recursive fan-out and gather type workflows that are so common in async.
-
- What you do with this completion data is up to you, but the most common use case is to
- feed it to one of the many progress bar modules.
-
- Most progress bar modules include a rudamentary version of this, but my
- needs were more complex.
-
- Usage
- =====
-
- ```javascript
- var TrackerGroup = require("are-we-there-yet").TrackerGroup
-
- var top = new TrackerGroup("program")
-
- var single = top.newItem("one thing", 100)
- single.completeWork(20)
-
- console.log(top.completed()) // 0.2
-
- fs.stat("file", function(er, stat) {
- if (er) throw er
- var stream = top.newStream("file", stat.size)
- console.log(top.completed()) // now 0.1 as single is 50% of the job and is 20% complete
- // and 50% * 20% == 10%
- fs.createReadStream("file").pipe(stream).on("data", function (chunk) {
- // do stuff with chunk
- })
- top.on("change", function (name) {
- // called each time a chunk is read from "file"
- // top.completed() will start at 0.1 and fill up to 0.6 as the file is read
- })
- })
- ```
-
- Shared Methods
- ==============
-
- * var completed = tracker.completed()
-
- Implemented in: `Tracker`, `TrackerGroup`, `TrackerStream`
-
- Returns the ratio of completed work to work to be done. Range of 0 to 1.
-
- * tracker.finish()
-
- Implemented in: `Tracker`, `TrackerGroup`
-
- Marks the tracker as completed. With a TrackerGroup this marks all of its
- components as completed.
-
- Marks all of the components of this tracker as finished, which in turn means
- that `tracker.completed()` for this will now be 1.
-
- This will result in one or more `change` events being emitted.
-
- Events
- ======
-
- All tracker objects emit `change` events with the following arguments:
-
- ```
- function (name, completed, tracker)
- ```
-
- `name` is the name of the tracker that originally emitted the event,
- or if it didn't have one, the first containing tracker group that had one.
-
- `completed` is the percent complete (as returned by `tracker.completed()` method).
-
- `tracker` is the tracker object that you are listening for events on.
-
- TrackerGroup
- ============
-
- * var tracker = new TrackerGroup(**name**)
-
- * **name** *(optional)* - The name of this tracker group, used in change
- notifications if the component updating didn't have a name. Defaults to undefined.
-
- Creates a new empty tracker aggregation group. These are trackers whose
- completion status is determined by the completion status of other trackers.
-
- * tracker.addUnit(**otherTracker**, **weight**)
-
- * **otherTracker** - Any of the other are-we-there-yet tracker objects
- * **weight** *(optional)* - The weight to give the tracker, defaults to 1.
-
- Adds the **otherTracker** to this aggregation group. The weight determines
- how long you expect this tracker to take to complete in proportion to other
- units. So for instance, if you add one tracker with a weight of 1 and
- another with a weight of 2, you're saying the second will take twice as long
- to complete as the first. As such, the first will account for 33% of the
- completion of this tracker and the second will account for the other 67%.
-
- Returns **otherTracker**.
-
- * var subGroup = tracker.newGroup(**name**, **weight**)
-
- The above is exactly equivalent to:
-
- ```javascript
- var subGroup = tracker.addUnit(new TrackerGroup(name), weight)
- ```
-
- * var subItem = tracker.newItem(**name**, **todo**, **weight**)
-
- The above is exactly equivalent to:
-
- ```javascript
- var subItem = tracker.addUnit(new Tracker(name, todo), weight)
- ```
-
- * var subStream = tracker.newStream(**name**, **todo**, **weight**)
-
- The above is exactly equivalent to:
-
- ```javascript
- var subStream = tracker.addUnit(new TrackerStream(name, todo), weight)
- ```
-
- * console.log( tracker.debug() )
-
- Returns a tree showing the completion of this tracker group and all of its
- children, including recursively entering all of the children.
-
- Tracker
- =======
-
- * var tracker = new Tracker(**name**, **todo**)
-
- * **name** *(optional)* The name of this counter to report in change
- events. Defaults to undefined.
- * **todo** *(optional)* The amount of work todo (a number). Defaults to 0.
-
- Ordinarily these are constructed as a part of a tracker group (via
- `newItem`).
-
- * var completed = tracker.completed()
-
- Returns the ratio of completed work to work to be done. Range of 0 to 1. If
- total work to be done is 0 then it will return 0.
-
- * tracker.addWork(**todo**)
-
- * **todo** A number to add to the amount of work to be done.
-
- Increases the amount of work to be done, thus decreasing the completion
- percentage. Triggers a `change` event.
-
- * tracker.completeWork(**completed**)
-
- * **completed** A number to add to the work complete
-
- Increase the amount of work complete, thus increasing the completion percentage.
- Will never increase the work completed past the amount of work todo. That is,
- percentages > 100% are not allowed. Triggers a `change` event.
-
- * tracker.finish()
-
- Marks this tracker as finished, tracker.completed() will now be 1. Triggers
- a `change` event.
-
- TrackerStream
- =============
-
- * var tracker = new TrackerStream(**name**, **size**, **options**)
-
- * **name** *(optional)* The name of this counter to report in change
- events. Defaults to undefined.
- * **size** *(optional)* The number of bytes being sent through this stream.
- * **options** *(optional)* A hash of stream options
-
- The tracker stream object is a pass through stream that updates an internal
- tracker object each time a block passes through. It's intended to track
- downloads, file extraction and other related activities. You use it by piping
- your data source into it and then using it as your data source.
-
- If your data has a length attribute then that's used as the amount of work
- completed when the chunk is passed through. If it does not (eg, object
- streams) then each chunk counts as completing 1 unit of work, so your size
- should be the total number of objects being streamed.
-
- * tracker.addWork(**todo**)
-
- * **todo** Increase the expected overall size by **todo** bytes.
-
- Increases the amount of work to be done, thus decreasing the completion
- percentage. Triggers a `change` event.
|