Fully end to end encrypted anonymous chat program. Server only stores public key lookup for users and the encrypted messages. No credentials are transfered to the server, but kept in local browser storage. This allows 100% safe chatting.
https://safechat.ch
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
2.4 KiB
135 lines
2.4 KiB
|
|
/*! |
|
* Stylus - Stack |
|
* Copyright (c) Automattic <developer.wordpress.com> |
|
* MIT Licensed |
|
*/ |
|
|
|
/** |
|
* Initialize a new `Stack`. |
|
* |
|
* @api private |
|
*/ |
|
|
|
var Stack = module.exports = function Stack() { |
|
Array.apply(this, arguments); |
|
}; |
|
|
|
/** |
|
* Inherit from `Array.prototype`. |
|
*/ |
|
|
|
Stack.prototype.__proto__ = Array.prototype; |
|
|
|
/** |
|
* Push the given `frame`. |
|
* |
|
* @param {Frame} frame |
|
* @api public |
|
*/ |
|
|
|
Stack.prototype.push = function(frame){ |
|
frame.stack = this; |
|
frame.parent = this.currentFrame; |
|
return [].push.apply(this, arguments); |
|
}; |
|
|
|
/** |
|
* Return the current stack `Frame`. |
|
* |
|
* @return {Frame} |
|
* @api private |
|
*/ |
|
|
|
Stack.prototype.__defineGetter__('currentFrame', function(){ |
|
return this[this.length - 1]; |
|
}); |
|
|
|
/** |
|
* Lookup stack frame for the given `block`. |
|
* |
|
* @param {Block} block |
|
* @return {Frame} |
|
* @api private |
|
*/ |
|
|
|
Stack.prototype.getBlockFrame = function(block){ |
|
for (var i = 0; i < this.length; ++i) { |
|
if (block == this[i].block) { |
|
return this[i]; |
|
} |
|
} |
|
}; |
|
|
|
/** |
|
* Lookup the given local variable `name`, relative |
|
* to the lexical scope of the current frame's `Block`. |
|
* |
|
* When the result of a lookup is an identifier |
|
* a recursive lookup is performed, defaulting to |
|
* returning the identifier itself. |
|
* |
|
* @param {String} name |
|
* @return {Node} |
|
* @api private |
|
*/ |
|
|
|
Stack.prototype.lookup = function(name){ |
|
var block = this.currentFrame.block |
|
, val |
|
, ret; |
|
|
|
do { |
|
var frame = this.getBlockFrame(block); |
|
if (frame && (val = frame.lookup(name))) { |
|
return val; |
|
} |
|
} while (block = block.parent); |
|
}; |
|
|
|
/** |
|
* Custom inspect. |
|
* |
|
* @return {String} |
|
* @api private |
|
*/ |
|
|
|
Stack.prototype.inspect = function(){ |
|
return this.reverse().map(function(frame){ |
|
return frame.inspect(); |
|
}).join('\n'); |
|
}; |
|
|
|
/** |
|
* Return stack string formatted as: |
|
* |
|
* at <context> (<filename>:<lineno>:<column>) |
|
* |
|
* @return {String} |
|
* @api private |
|
*/ |
|
|
|
Stack.prototype.toString = function(){ |
|
var block |
|
, node |
|
, buf = [] |
|
, location |
|
, len = this.length; |
|
|
|
while (len--) { |
|
block = this[len].block; |
|
if (node = block.node) { |
|
location = '(' + node.filename + ':' + (node.lineno + 1) + ':' + node.column + ')'; |
|
switch (node.nodeName) { |
|
case 'function': |
|
buf.push(' at ' + node.name + '() ' + location); |
|
break; |
|
case 'group': |
|
buf.push(' at "' + node.nodes[0].val + '" ' + location); |
|
break; |
|
} |
|
} |
|
} |
|
|
|
return buf.join('\n'); |
|
};
|
|
|