File: channels.js

package info (click to toggle)
node-channels 0.0.5-3
  • links: PTS, VCS
  • area: main
  • in suites: buster, jessie, jessie-kfreebsd, stretch
  • size: 88 kB
  • ctags: 5
  • sloc: makefile: 2
file content (75 lines) | stat: -rw-r--r-- 1,953 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/**
 * 2011 Peter 'Pita' Martischka
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS-IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

var domain;
try {
  domain = require('domain');
} catch(e){
  //domains only exist in 0.8+
}
 
exports.channels = function(operatorFunction)
{
  this.channels = {};
  this.operatorFunction = operatorFunction;
}

exports.channels.prototype.emit = function(channelname, object)
{
  var _this = this;
  
  //this channel already exists, add it to the queue
  if(_this.channels[channelname])
  {
    if(domain && domain.active){
      object.__domain = domain.active;
    }

    _this.channels[channelname].push(object);
  }
  //this channel is new, create it and start it
  else
  {
    //create the channel array
    _this.channels[channelname] = [];
    
    _this.operatorFunction(object, function iterator()
    {
      //get the next element
      var next = _this.channels[channelname].shift();
      
      //if there is nothing todo anymore in this channel, clean it up
      if(next !== undefined)
      {
        // if this method has a domain, call it in the domain
        if(next.__domain){
          var activeDomain = next.__domain;
          delete next.__domain;

          activeDomain.run(function(){
            _this.operatorFunction(next, iterator);
          });
        } else {
          _this.operatorFunction(next, iterator);
        }
      }
      else
      {
        delete _this.channels[channelname];
      }
    });
  }
}