aboutsummaryrefslogtreecommitdiffstats
path: root/src/XSitePost.js
blob: 7d81e20739e2c6593b344b493322c8d3ddc0447e (plain)
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// Copyright (C) 2008,2009 BRAT Tech LLC

if (typeof nglr == 'undefined') nglr = {};

if (typeof console == 'undefined') console = {};
if (typeof console.log == 'undefined')
  console.log = function() {};
if (typeof console.error == 'undefined')
  console.error = function() {};

nglr.XSitePost = function(baseUrl, window, prefix) {
  this.baseUrl = baseUrl;
  this.post = jQuery.post;
  this.window = window;
  this.inQueue = {};
  this.outQueue = [];
  this.maxMsgSize = 100000;
  this.delay = 20;
  this.prefix = prefix;
  this.setTimeout=function(fn, delay){window.setTimeout(fn, delay);};
};

nglr.XSitePost.prototype.init = function() {
  this.window.name = '';
  this.response('ready', 'null');
};

nglr.XSitePost.prototype.incomingFragment = function(fragment) {
  var parts = fragment.split(";");
  this.incomingMsg(parts.shift(), 1*parts.shift(), 1*parts.shift(), parts.shift());
};

nglr.XSitePost.prototype.incomingMsg = function(id, partNo, totalParts, msgPart) {
  var msg = this.inQueue[id];
  if (!msg) {
    msg = {id:id, parts:[], count:0};
    this.inQueue[id] = msg;
  }
  msg.parts[partNo] = msgPart;
  msg.count++;
  if (totalParts === msg.count) {
    delete this.inQueue[id];
    var request = this.decodePost(msg.parts.join(''));
    var self = this;
    this.post(this.baseUrl + request.url, request.params, function(response, status){
      self.response(id, response, status);
    });
  }
};

nglr.XSitePost.prototype.response = function(id, response, status) {
  var start = 0;
  var end;
  var msg = Base64.encode(response);
  var msgLen = msg.length;
  var total = Math.ceil(msgLen / this.maxMsgSize);
  var part = 0;
  while (start < msgLen) {
    end = Math.min(msgLen, start + this.maxMsgSize);
    this.outQueue.push(id + ':'+part+':'+total+':' + msg.substring(start, end));
    start = end;
    part++;
  }
};

nglr.XSitePost.prototype.decodePost = function(post) {
  var parts = post.split(':');
  var url = Base64.decode(parts.shift());
  var params = {};
  while(parts.length !== 0) {
    var key = parts.shift();
    var value = Base64.decode(parts.shift());
    params[key] = value;
  }
  return {url:url, params:params};
};

nglr.XSitePost.prototype.listen = function() {
  console.log("listen()");
  var self = this;
  var window = this.window;
  var outQueue = this.outQueue;
  var setTimeout = this.setTimeout;
  var prefix = this.prefix;
  var prefixLen = prefix.length;
  var prefixRec = prefix + '>';
  var prefixRecLen = prefixRec.length;
  window.name = prefix;
  var pull = function(){
    var value = window.name;
    if (value == prefix && outQueue.length > 0) {
      window.name = prefix + '<' + outQueue.shift();
    } else if (value.substr(0, prefixRecLen) == prefixRec) {
      self.incomingFragment(value.substr(prefixRecLen));
      window.name = prefix;
    }
    setTimeout(pull, self.delay);
  };
  pull();
};