Refactor module system from AMD to CommonJS
This commit is contained in:
parent
2d5b01719a
commit
375719b49b
1741
lib/encoding.js
1741
lib/encoding.js
File diff suppressed because it is too large
Load Diff
|
@ -1,74 +1,71 @@
|
||||||
define(function(require) {
|
// Based on https://github.com/diy/intercom.js/blob/master/lib/events.js
|
||||||
|
// Copyright 2012 DIY Co Apache License, Version 2.0
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
// Based on https://github.com/diy/intercom.js/blob/master/lib/events.js
|
function removeItem(item, array) {
|
||||||
// Copyright 2012 DIY Co Apache License, Version 2.0
|
for (var i = array.length - 1; i >= 0; i--) {
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
if (array[i] === item) {
|
||||||
|
array.splice(i, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
function removeItem(item, array) {
|
var EventEmitter = function() {};
|
||||||
for (var i = array.length - 1; i >= 0; i--) {
|
|
||||||
if (array[i] === item) {
|
EventEmitter.createInterface = function(space) {
|
||||||
array.splice(i, 1);
|
var methods = {};
|
||||||
|
|
||||||
|
methods.on = function(name, fn) {
|
||||||
|
if (typeof this[space] === 'undefined') {
|
||||||
|
this[space] = {};
|
||||||
|
}
|
||||||
|
if (!this[space].hasOwnProperty(name)) {
|
||||||
|
this[space][name] = [];
|
||||||
|
}
|
||||||
|
this[space][name].push(fn);
|
||||||
|
};
|
||||||
|
|
||||||
|
methods.off = function(name, fn) {
|
||||||
|
if (typeof this[space] === 'undefined') return;
|
||||||
|
if (this[space].hasOwnProperty(name)) {
|
||||||
|
removeItem(fn, this[space][name]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
methods.trigger = function(name) {
|
||||||
|
if (typeof this[space] !== 'undefined' && this[space].hasOwnProperty(name)) {
|
||||||
|
var args = Array.prototype.slice.call(arguments, 1);
|
||||||
|
for (var i = 0; i < this[space][name].length; i++) {
|
||||||
|
this[space][name][i].apply(this[space][name][i], args);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return array;
|
|
||||||
}
|
|
||||||
|
|
||||||
var EventEmitter = function() {};
|
|
||||||
|
|
||||||
EventEmitter.createInterface = function(space) {
|
|
||||||
var methods = {};
|
|
||||||
|
|
||||||
methods.on = function(name, fn) {
|
|
||||||
if (typeof this[space] === 'undefined') {
|
|
||||||
this[space] = {};
|
|
||||||
}
|
|
||||||
if (!this[space].hasOwnProperty(name)) {
|
|
||||||
this[space][name] = [];
|
|
||||||
}
|
|
||||||
this[space][name].push(fn);
|
|
||||||
};
|
|
||||||
|
|
||||||
methods.off = function(name, fn) {
|
|
||||||
if (typeof this[space] === 'undefined') return;
|
|
||||||
if (this[space].hasOwnProperty(name)) {
|
|
||||||
removeItem(fn, this[space][name]);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
methods.trigger = function(name) {
|
|
||||||
if (typeof this[space] !== 'undefined' && this[space].hasOwnProperty(name)) {
|
|
||||||
var args = Array.prototype.slice.call(arguments, 1);
|
|
||||||
for (var i = 0; i < this[space][name].length; i++) {
|
|
||||||
this[space][name][i].apply(this[space][name][i], args);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
methods.removeAllListeners = function(name) {
|
|
||||||
if (typeof this[space] === 'undefined') return;
|
|
||||||
var self = this;
|
|
||||||
self[space][name].forEach(function(fn) {
|
|
||||||
self.off(name, fn);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
return methods;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
var pvt = EventEmitter.createInterface('_handlers');
|
methods.removeAllListeners = function(name) {
|
||||||
EventEmitter.prototype._on = pvt.on;
|
if (typeof this[space] === 'undefined') return;
|
||||||
EventEmitter.prototype._off = pvt.off;
|
var self = this;
|
||||||
EventEmitter.prototype._trigger = pvt.trigger;
|
self[space][name].forEach(function(fn) {
|
||||||
|
self.off(name, fn);
|
||||||
var pub = EventEmitter.createInterface('handlers');
|
});
|
||||||
EventEmitter.prototype.on = function() {
|
|
||||||
pub.on.apply(this, arguments);
|
|
||||||
Array.prototype.unshift.call(arguments, 'on');
|
|
||||||
this._trigger.apply(this, arguments);
|
|
||||||
};
|
};
|
||||||
EventEmitter.prototype.off = pub.off;
|
|
||||||
EventEmitter.prototype.trigger = pub.trigger;
|
|
||||||
EventEmitter.prototype.removeAllListeners = pub.removeAllListeners;
|
|
||||||
|
|
||||||
return EventEmitter;
|
return methods;
|
||||||
});
|
};
|
||||||
|
|
||||||
|
var pvt = EventEmitter.createInterface('_handlers');
|
||||||
|
EventEmitter.prototype._on = pvt.on;
|
||||||
|
EventEmitter.prototype._off = pvt.off;
|
||||||
|
EventEmitter.prototype._trigger = pvt.trigger;
|
||||||
|
|
||||||
|
var pub = EventEmitter.createInterface('handlers');
|
||||||
|
EventEmitter.prototype.on = function() {
|
||||||
|
pub.on.apply(this, arguments);
|
||||||
|
Array.prototype.unshift.call(arguments, 'on');
|
||||||
|
this._trigger.apply(this, arguments);
|
||||||
|
};
|
||||||
|
EventEmitter.prototype.off = pub.off;
|
||||||
|
EventEmitter.prototype.trigger = pub.trigger;
|
||||||
|
EventEmitter.prototype.removeAllListeners = pub.removeAllListeners;
|
||||||
|
|
||||||
|
module.exports = EventEmitter;
|
||||||
|
|
547
lib/intercom.js
547
lib/intercom.js
|
@ -1,321 +1,318 @@
|
||||||
define(function(require) {
|
// Based on https://github.com/diy/intercom.js/blob/master/lib/intercom.js
|
||||||
|
// Copyright 2012 DIY Co Apache License, Version 2.0
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
// Based on https://github.com/diy/intercom.js/blob/master/lib/intercom.js
|
var EventEmitter = require('./eventemitter.js');
|
||||||
// Copyright 2012 DIY Co Apache License, Version 2.0
|
var guid = require('../src/shared.js').guid;
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
var EventEmitter = require('eventemitter');
|
function throttle(delay, fn) {
|
||||||
var guid = require('src/shared').guid;
|
var last = 0;
|
||||||
|
return function() {
|
||||||
function throttle(delay, fn) {
|
|
||||||
var last = 0;
|
|
||||||
return function() {
|
|
||||||
var now = Date.now();
|
|
||||||
if (now - last > delay) {
|
|
||||||
last = now;
|
|
||||||
fn.apply(this, arguments);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function extend(a, b) {
|
|
||||||
if (typeof a === 'undefined' || !a) { a = {}; }
|
|
||||||
if (typeof b === 'object') {
|
|
||||||
for (var key in b) {
|
|
||||||
if (b.hasOwnProperty(key)) {
|
|
||||||
a[key] = b[key];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
var localStorage = (function(window) {
|
|
||||||
if (typeof window === 'undefined' ||
|
|
||||||
typeof window.localStorage === 'undefined') {
|
|
||||||
return {
|
|
||||||
getItem : function() {},
|
|
||||||
setItem : function() {},
|
|
||||||
removeItem : function() {}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
return window.localStorage;
|
|
||||||
}(this));
|
|
||||||
|
|
||||||
function Intercom() {
|
|
||||||
var self = this;
|
|
||||||
var now = Date.now();
|
var now = Date.now();
|
||||||
|
if (now - last > delay) {
|
||||||
|
last = now;
|
||||||
|
fn.apply(this, arguments);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
this.origin = guid();
|
function extend(a, b) {
|
||||||
this.lastMessage = now;
|
if (typeof a === 'undefined' || !a) { a = {}; }
|
||||||
this.receivedIDs = {};
|
if (typeof b === 'object') {
|
||||||
this.previousValues = {};
|
for (var key in b) {
|
||||||
|
if (b.hasOwnProperty(key)) {
|
||||||
|
a[key] = b[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
var storageHandler = function() {
|
var localStorage = (function(window) {
|
||||||
self._onStorageEvent.apply(self, arguments);
|
if (typeof window === 'undefined' ||
|
||||||
|
typeof window.localStorage === 'undefined') {
|
||||||
|
return {
|
||||||
|
getItem : function() {},
|
||||||
|
setItem : function() {},
|
||||||
|
removeItem : function() {}
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
return window.localStorage;
|
||||||
|
}(this));
|
||||||
|
|
||||||
// If we're in node.js, skip event registration
|
function Intercom() {
|
||||||
if (typeof window === 'undefined' || typeof document === 'undefined') {
|
var self = this;
|
||||||
|
var now = Date.now();
|
||||||
|
|
||||||
|
this.origin = guid();
|
||||||
|
this.lastMessage = now;
|
||||||
|
this.receivedIDs = {};
|
||||||
|
this.previousValues = {};
|
||||||
|
|
||||||
|
var storageHandler = function() {
|
||||||
|
self._onStorageEvent.apply(self, arguments);
|
||||||
|
};
|
||||||
|
|
||||||
|
// If we're in node.js, skip event registration
|
||||||
|
if (typeof window === 'undefined' || typeof document === 'undefined') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (document.attachEvent) {
|
||||||
|
document.attachEvent('onstorage', storageHandler);
|
||||||
|
} else {
|
||||||
|
window.addEventListener('storage', storageHandler, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Intercom.prototype._transaction = function(fn) {
|
||||||
|
var TIMEOUT = 1000;
|
||||||
|
var WAIT = 20;
|
||||||
|
var self = this;
|
||||||
|
var executed = false;
|
||||||
|
var listening = false;
|
||||||
|
var waitTimer = null;
|
||||||
|
|
||||||
|
function lock() {
|
||||||
|
if (executed) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (document.attachEvent) {
|
var now = Date.now();
|
||||||
document.attachEvent('onstorage', storageHandler);
|
var activeLock = localStorage.getItem(INDEX_LOCK)|0;
|
||||||
} else {
|
if (activeLock && now - activeLock < TIMEOUT) {
|
||||||
window.addEventListener('storage', storageHandler, false);
|
if (!listening) {
|
||||||
|
self._on('storage', lock);
|
||||||
|
listening = true;
|
||||||
|
}
|
||||||
|
waitTimer = setTimeout(lock, WAIT);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
executed = true;
|
||||||
|
localStorage.setItem(INDEX_LOCK, now);
|
||||||
|
|
||||||
|
fn();
|
||||||
|
unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
Intercom.prototype._transaction = function(fn) {
|
function unlock() {
|
||||||
var TIMEOUT = 1000;
|
if (listening) {
|
||||||
var WAIT = 20;
|
self._off('storage', lock);
|
||||||
var self = this;
|
}
|
||||||
var executed = false;
|
if (waitTimer) {
|
||||||
var listening = false;
|
clearTimeout(waitTimer);
|
||||||
var waitTimer = null;
|
}
|
||||||
|
localStorage.removeItem(INDEX_LOCK);
|
||||||
|
}
|
||||||
|
|
||||||
function lock() {
|
lock();
|
||||||
if (executed) {
|
};
|
||||||
return;
|
|
||||||
|
Intercom.prototype._cleanup_emit = throttle(100, function() {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
self._transaction(function() {
|
||||||
|
var now = Date.now();
|
||||||
|
var threshold = now - THRESHOLD_TTL_EMIT;
|
||||||
|
var changed = 0;
|
||||||
|
var messages;
|
||||||
|
|
||||||
|
try {
|
||||||
|
messages = JSON.parse(localStorage.getItem(INDEX_EMIT) || '[]');
|
||||||
|
} catch(e) {
|
||||||
|
messages = [];
|
||||||
|
}
|
||||||
|
for (var i = messages.length - 1; i >= 0; i--) {
|
||||||
|
if (messages[i].timestamp < threshold) {
|
||||||
|
messages.splice(i, 1);
|
||||||
|
changed++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if (changed > 0) {
|
||||||
|
localStorage.setItem(INDEX_EMIT, JSON.stringify(messages));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
var now = Date.now();
|
Intercom.prototype._cleanup_once = throttle(100, function() {
|
||||||
var activeLock = localStorage.getItem(INDEX_LOCK)|0;
|
var self = this;
|
||||||
if (activeLock && now - activeLock < TIMEOUT) {
|
|
||||||
if (!listening) {
|
self._transaction(function() {
|
||||||
self._on('storage', lock);
|
var timestamp, ttl, key;
|
||||||
listening = true;
|
var table;
|
||||||
}
|
var now = Date.now();
|
||||||
waitTimer = setTimeout(lock, WAIT);
|
var changed = 0;
|
||||||
return;
|
|
||||||
|
try {
|
||||||
|
table = JSON.parse(localStorage.getItem(INDEX_ONCE) || '{}');
|
||||||
|
} catch(e) {
|
||||||
|
table = {};
|
||||||
|
}
|
||||||
|
for (key in table) {
|
||||||
|
if (self._once_expired(key, table)) {
|
||||||
|
delete table[key];
|
||||||
|
changed++;
|
||||||
}
|
}
|
||||||
executed = true;
|
|
||||||
localStorage.setItem(INDEX_LOCK, now);
|
|
||||||
|
|
||||||
fn();
|
|
||||||
unlock();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function unlock() {
|
if (changed > 0) {
|
||||||
if (listening) {
|
localStorage.setItem(INDEX_ONCE, JSON.stringify(table));
|
||||||
self._off('storage', lock);
|
|
||||||
}
|
|
||||||
if (waitTimer) {
|
|
||||||
clearTimeout(waitTimer);
|
|
||||||
}
|
|
||||||
localStorage.removeItem(INDEX_LOCK);
|
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
lock();
|
Intercom.prototype._once_expired = function(key, table) {
|
||||||
};
|
if (!table) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!table.hasOwnProperty(key)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (typeof table[key] !== 'object') {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
Intercom.prototype._cleanup_emit = throttle(100, function() {
|
var ttl = table[key].ttl || THRESHOLD_TTL_ONCE;
|
||||||
var self = this;
|
var now = Date.now();
|
||||||
|
var timestamp = table[key].timestamp;
|
||||||
|
return timestamp < now - ttl;
|
||||||
|
};
|
||||||
|
|
||||||
self._transaction(function() {
|
Intercom.prototype._localStorageChanged = function(event, field) {
|
||||||
|
if (event && event.key) {
|
||||||
|
return event.key === field;
|
||||||
|
}
|
||||||
|
|
||||||
|
var currentValue = localStorage.getItem(field);
|
||||||
|
if (currentValue === this.previousValues[field]) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
this.previousValues[field] = currentValue;
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
Intercom.prototype._onStorageEvent = function(event) {
|
||||||
|
event = event || window.event;
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
if (this._localStorageChanged(event, INDEX_EMIT)) {
|
||||||
|
this._transaction(function() {
|
||||||
var now = Date.now();
|
var now = Date.now();
|
||||||
var threshold = now - THRESHOLD_TTL_EMIT;
|
var data = localStorage.getItem(INDEX_EMIT);
|
||||||
var changed = 0;
|
|
||||||
var messages;
|
var messages;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
messages = JSON.parse(localStorage.getItem(INDEX_EMIT) || '[]');
|
messages = JSON.parse(data || '[]');
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
messages = [];
|
messages = [];
|
||||||
}
|
}
|
||||||
for (var i = messages.length - 1; i >= 0; i--) {
|
for (var i = 0; i < messages.length; i++) {
|
||||||
if (messages[i].timestamp < threshold) {
|
if (messages[i].origin === self.origin) continue;
|
||||||
messages.splice(i, 1);
|
if (messages[i].timestamp < self.lastMessage) continue;
|
||||||
changed++;
|
if (messages[i].id) {
|
||||||
|
if (self.receivedIDs.hasOwnProperty(messages[i].id)) continue;
|
||||||
|
self.receivedIDs[messages[i].id] = true;
|
||||||
}
|
}
|
||||||
|
self.trigger(messages[i].name, messages[i].payload);
|
||||||
}
|
}
|
||||||
if (changed > 0) {
|
self.lastMessage = now;
|
||||||
localStorage.setItem(INDEX_EMIT, JSON.stringify(messages));
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
this._trigger('storage', event);
|
||||||
|
};
|
||||||
|
|
||||||
|
Intercom.prototype._emit = function(name, message, id) {
|
||||||
|
id = (typeof id === 'string' || typeof id === 'number') ? String(id) : null;
|
||||||
|
if (id && id.length) {
|
||||||
|
if (this.receivedIDs.hasOwnProperty(id)) return;
|
||||||
|
this.receivedIDs[id] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
var packet = {
|
||||||
|
id : id,
|
||||||
|
name : name,
|
||||||
|
origin : this.origin,
|
||||||
|
timestamp : Date.now(),
|
||||||
|
payload : message
|
||||||
|
};
|
||||||
|
|
||||||
|
var self = this;
|
||||||
|
this._transaction(function() {
|
||||||
|
var data = localStorage.getItem(INDEX_EMIT) || '[]';
|
||||||
|
var delimiter = (data === '[]') ? '' : ',';
|
||||||
|
data = [data.substring(0, data.length - 1), delimiter, JSON.stringify(packet), ']'].join('');
|
||||||
|
localStorage.setItem(INDEX_EMIT, data);
|
||||||
|
self.trigger(name, message);
|
||||||
|
|
||||||
|
setTimeout(function() {
|
||||||
|
self._cleanup_emit();
|
||||||
|
}, 50);
|
||||||
});
|
});
|
||||||
|
};
|
||||||
|
|
||||||
Intercom.prototype._cleanup_once = throttle(100, function() {
|
Intercom.prototype.emit = function(name, message) {
|
||||||
var self = this;
|
this._emit.apply(this, arguments);
|
||||||
|
this._trigger('emit', name, message);
|
||||||
|
};
|
||||||
|
|
||||||
self._transaction(function() {
|
Intercom.prototype.once = function(key, fn, ttl) {
|
||||||
var timestamp, ttl, key;
|
if (!Intercom.supported) {
|
||||||
var table;
|
return;
|
||||||
var now = Date.now();
|
}
|
||||||
var changed = 0;
|
|
||||||
|
|
||||||
try {
|
var self = this;
|
||||||
table = JSON.parse(localStorage.getItem(INDEX_ONCE) || '{}');
|
this._transaction(function() {
|
||||||
} catch(e) {
|
var data;
|
||||||
table = {};
|
try {
|
||||||
}
|
data = JSON.parse(localStorage.getItem(INDEX_ONCE) || '{}');
|
||||||
for (key in table) {
|
} catch(e) {
|
||||||
if (self._once_expired(key, table)) {
|
data = {};
|
||||||
delete table[key];
|
|
||||||
changed++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (changed > 0) {
|
|
||||||
localStorage.setItem(INDEX_ONCE, JSON.stringify(table));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
Intercom.prototype._once_expired = function(key, table) {
|
|
||||||
if (!table) {
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
if (!table.hasOwnProperty(key)) {
|
if (!self._once_expired(key, data)) {
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (typeof table[key] !== 'object') {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
var ttl = table[key].ttl || THRESHOLD_TTL_ONCE;
|
|
||||||
var now = Date.now();
|
|
||||||
var timestamp = table[key].timestamp;
|
|
||||||
return timestamp < now - ttl;
|
|
||||||
};
|
|
||||||
|
|
||||||
Intercom.prototype._localStorageChanged = function(event, field) {
|
|
||||||
if (event && event.key) {
|
|
||||||
return event.key === field;
|
|
||||||
}
|
|
||||||
|
|
||||||
var currentValue = localStorage.getItem(field);
|
|
||||||
if (currentValue === this.previousValues[field]) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
this.previousValues[field] = currentValue;
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
|
|
||||||
Intercom.prototype._onStorageEvent = function(event) {
|
|
||||||
event = event || window.event;
|
|
||||||
var self = this;
|
|
||||||
|
|
||||||
if (this._localStorageChanged(event, INDEX_EMIT)) {
|
|
||||||
this._transaction(function() {
|
|
||||||
var now = Date.now();
|
|
||||||
var data = localStorage.getItem(INDEX_EMIT);
|
|
||||||
var messages;
|
|
||||||
|
|
||||||
try {
|
|
||||||
messages = JSON.parse(data || '[]');
|
|
||||||
} catch(e) {
|
|
||||||
messages = [];
|
|
||||||
}
|
|
||||||
for (var i = 0; i < messages.length; i++) {
|
|
||||||
if (messages[i].origin === self.origin) continue;
|
|
||||||
if (messages[i].timestamp < self.lastMessage) continue;
|
|
||||||
if (messages[i].id) {
|
|
||||||
if (self.receivedIDs.hasOwnProperty(messages[i].id)) continue;
|
|
||||||
self.receivedIDs[messages[i].id] = true;
|
|
||||||
}
|
|
||||||
self.trigger(messages[i].name, messages[i].payload);
|
|
||||||
}
|
|
||||||
self.lastMessage = now;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
this._trigger('storage', event);
|
|
||||||
};
|
|
||||||
|
|
||||||
Intercom.prototype._emit = function(name, message, id) {
|
|
||||||
id = (typeof id === 'string' || typeof id === 'number') ? String(id) : null;
|
|
||||||
if (id && id.length) {
|
|
||||||
if (this.receivedIDs.hasOwnProperty(id)) return;
|
|
||||||
this.receivedIDs[id] = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
var packet = {
|
|
||||||
id : id,
|
|
||||||
name : name,
|
|
||||||
origin : this.origin,
|
|
||||||
timestamp : Date.now(),
|
|
||||||
payload : message
|
|
||||||
};
|
|
||||||
|
|
||||||
var self = this;
|
|
||||||
this._transaction(function() {
|
|
||||||
var data = localStorage.getItem(INDEX_EMIT) || '[]';
|
|
||||||
var delimiter = (data === '[]') ? '' : ',';
|
|
||||||
data = [data.substring(0, data.length - 1), delimiter, JSON.stringify(packet), ']'].join('');
|
|
||||||
localStorage.setItem(INDEX_EMIT, data);
|
|
||||||
self.trigger(name, message);
|
|
||||||
|
|
||||||
setTimeout(function() {
|
|
||||||
self._cleanup_emit();
|
|
||||||
}, 50);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
Intercom.prototype.emit = function(name, message) {
|
|
||||||
this._emit.apply(this, arguments);
|
|
||||||
this._trigger('emit', name, message);
|
|
||||||
};
|
|
||||||
|
|
||||||
Intercom.prototype.once = function(key, fn, ttl) {
|
|
||||||
if (!Intercom.supported) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var self = this;
|
data[key] = {};
|
||||||
this._transaction(function() {
|
data[key].timestamp = Date.now();
|
||||||
var data;
|
if (typeof ttl === 'number') {
|
||||||
try {
|
data[key].ttl = ttl * 1000;
|
||||||
data = JSON.parse(localStorage.getItem(INDEX_ONCE) || '{}');
|
}
|
||||||
} catch(e) {
|
|
||||||
data = {};
|
|
||||||
}
|
|
||||||
if (!self._once_expired(key, data)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
data[key] = {};
|
localStorage.setItem(INDEX_ONCE, JSON.stringify(data));
|
||||||
data[key].timestamp = Date.now();
|
fn();
|
||||||
if (typeof ttl === 'number') {
|
|
||||||
data[key].ttl = ttl * 1000;
|
|
||||||
}
|
|
||||||
|
|
||||||
localStorage.setItem(INDEX_ONCE, JSON.stringify(data));
|
setTimeout(function() {
|
||||||
fn();
|
self._cleanup_once();
|
||||||
|
}, 50);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
setTimeout(function() {
|
extend(Intercom.prototype, EventEmitter.prototype);
|
||||||
self._cleanup_once();
|
|
||||||
}, 50);
|
Intercom.supported = (typeof localStorage !== 'undefined');
|
||||||
});
|
|
||||||
|
var INDEX_EMIT = 'intercom';
|
||||||
|
var INDEX_ONCE = 'intercom_once';
|
||||||
|
var INDEX_LOCK = 'intercom_lock';
|
||||||
|
|
||||||
|
var THRESHOLD_TTL_EMIT = 50000;
|
||||||
|
var THRESHOLD_TTL_ONCE = 1000 * 3600;
|
||||||
|
|
||||||
|
Intercom.destroy = function() {
|
||||||
|
localStorage.removeItem(INDEX_LOCK);
|
||||||
|
localStorage.removeItem(INDEX_EMIT);
|
||||||
|
localStorage.removeItem(INDEX_ONCE);
|
||||||
|
};
|
||||||
|
|
||||||
|
Intercom.getInstance = (function() {
|
||||||
|
var intercom;
|
||||||
|
return function() {
|
||||||
|
if (!intercom) {
|
||||||
|
intercom = new Intercom();
|
||||||
|
}
|
||||||
|
return intercom;
|
||||||
};
|
};
|
||||||
|
})();
|
||||||
|
|
||||||
extend(Intercom.prototype, EventEmitter.prototype);
|
module.exports = Intercom;
|
||||||
|
|
||||||
Intercom.supported = (typeof localStorage !== 'undefined');
|
|
||||||
|
|
||||||
var INDEX_EMIT = 'intercom';
|
|
||||||
var INDEX_ONCE = 'intercom_once';
|
|
||||||
var INDEX_LOCK = 'intercom_lock';
|
|
||||||
|
|
||||||
var THRESHOLD_TTL_EMIT = 50000;
|
|
||||||
var THRESHOLD_TTL_ONCE = 1000 * 3600;
|
|
||||||
|
|
||||||
Intercom.destroy = function() {
|
|
||||||
localStorage.removeItem(INDEX_LOCK);
|
|
||||||
localStorage.removeItem(INDEX_EMIT);
|
|
||||||
localStorage.removeItem(INDEX_ONCE);
|
|
||||||
};
|
|
||||||
|
|
||||||
Intercom.getInstance = (function() {
|
|
||||||
var intercom;
|
|
||||||
return function() {
|
|
||||||
if (!intercom) {
|
|
||||||
intercom = new Intercom();
|
|
||||||
}
|
|
||||||
return intercom;
|
|
||||||
};
|
|
||||||
})();
|
|
||||||
|
|
||||||
return Intercom;
|
|
||||||
});
|
|
||||||
|
|
157
lib/nodash.js
157
lib/nodash.js
|
@ -7,96 +7,91 @@
|
||||||
* Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
* Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
||||||
* Available under MIT license <http://lodash.com/license>
|
* Available under MIT license <http://lodash.com/license>
|
||||||
*/
|
*/
|
||||||
|
var ArrayProto = Array.prototype;
|
||||||
|
var nativeForEach = ArrayProto.forEach;
|
||||||
|
var nativeIndexOf = ArrayProto.indexOf;
|
||||||
|
var nativeSome = ArrayProto.some;
|
||||||
|
|
||||||
define(function(require) {
|
var ObjProto = Object.prototype;
|
||||||
|
var hasOwnProperty = ObjProto.hasOwnProperty;
|
||||||
|
var nativeKeys = Object.keys;
|
||||||
|
|
||||||
var ArrayProto = Array.prototype;
|
var breaker = {};
|
||||||
var nativeForEach = ArrayProto.forEach;
|
|
||||||
var nativeIndexOf = ArrayProto.indexOf;
|
|
||||||
var nativeSome = ArrayProto.some;
|
|
||||||
|
|
||||||
var ObjProto = Object.prototype;
|
function has(obj, key) {
|
||||||
var hasOwnProperty = ObjProto.hasOwnProperty;
|
return hasOwnProperty.call(obj, key);
|
||||||
var nativeKeys = Object.keys;
|
}
|
||||||
|
|
||||||
var breaker = {};
|
var keys = nativeKeys || function(obj) {
|
||||||
|
if (obj !== Object(obj)) throw new TypeError('Invalid object');
|
||||||
|
var keys = [];
|
||||||
|
for (var key in obj) if (has(obj, key)) keys.push(key);
|
||||||
|
return keys;
|
||||||
|
};
|
||||||
|
|
||||||
function has(obj, key) {
|
function size(obj) {
|
||||||
return hasOwnProperty.call(obj, key);
|
if (obj == null) return 0;
|
||||||
}
|
return (obj.length === +obj.length) ? obj.length : keys(obj).length;
|
||||||
|
}
|
||||||
|
|
||||||
var keys = nativeKeys || function(obj) {
|
function identity(value) {
|
||||||
if (obj !== Object(obj)) throw new TypeError('Invalid object');
|
return value;
|
||||||
var keys = [];
|
}
|
||||||
for (var key in obj) if (has(obj, key)) keys.push(key);
|
|
||||||
return keys;
|
|
||||||
};
|
|
||||||
|
|
||||||
function size(obj) {
|
function each(obj, iterator, context) {
|
||||||
if (obj == null) return 0;
|
var i, length;
|
||||||
return (obj.length === +obj.length) ? obj.length : keys(obj).length;
|
if (obj == null) return;
|
||||||
}
|
if (nativeForEach && obj.forEach === nativeForEach) {
|
||||||
|
obj.forEach(iterator, context);
|
||||||
function identity(value) {
|
} else if (obj.length === +obj.length) {
|
||||||
return value;
|
for (i = 0, length = obj.length; i < length; i++) {
|
||||||
}
|
if (iterator.call(context, obj[i], i, obj) === breaker) return;
|
||||||
|
}
|
||||||
function each(obj, iterator, context) {
|
} else {
|
||||||
var i, length;
|
var keys = keys(obj);
|
||||||
if (obj == null) return;
|
for (i = 0, length = keys.length; i < length; i++) {
|
||||||
if (nativeForEach && obj.forEach === nativeForEach) {
|
if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return;
|
||||||
obj.forEach(iterator, context);
|
|
||||||
} else if (obj.length === +obj.length) {
|
|
||||||
for (i = 0, length = obj.length; i < length; i++) {
|
|
||||||
if (iterator.call(context, obj[i], i, obj) === breaker) return;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
var keys = keys(obj);
|
|
||||||
for (i = 0, length = keys.length; i < length; i++) {
|
|
||||||
if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
function any(obj, iterator, context) {
|
|
||||||
iterator || (iterator = identity);
|
|
||||||
var result = false;
|
|
||||||
if (obj == null) return result;
|
|
||||||
if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
|
|
||||||
each(obj, function(value, index, list) {
|
|
||||||
if (result || (result = iterator.call(context, value, index, list))) return breaker;
|
|
||||||
});
|
|
||||||
return !!result;
|
|
||||||
};
|
|
||||||
|
|
||||||
function contains(obj, target) {
|
|
||||||
if (obj == null) return false;
|
|
||||||
if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
|
|
||||||
return any(obj, function(value) {
|
|
||||||
return value === target;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
function Wrapped(value) {
|
|
||||||
this.value = value;
|
|
||||||
}
|
}
|
||||||
Wrapped.prototype.has = function(key) {
|
};
|
||||||
return has(this.value, key);
|
|
||||||
};
|
|
||||||
Wrapped.prototype.contains = function(target) {
|
|
||||||
return contains(this.value, target);
|
|
||||||
};
|
|
||||||
Wrapped.prototype.size = function() {
|
|
||||||
return size(this.value);
|
|
||||||
};
|
|
||||||
|
|
||||||
function nodash(value) {
|
function any(obj, iterator, context) {
|
||||||
// don't wrap if already wrapped, even if wrapped by a different `lodash` constructor
|
iterator || (iterator = identity);
|
||||||
return (value && typeof value == 'object' && !Array.isArray(value) && hasOwnProperty.call(value, '__wrapped__'))
|
var result = false;
|
||||||
? value
|
if (obj == null) return result;
|
||||||
: new Wrapped(value);
|
if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
|
||||||
}
|
each(obj, function(value, index, list) {
|
||||||
|
if (result || (result = iterator.call(context, value, index, list))) return breaker;
|
||||||
|
});
|
||||||
|
return !!result;
|
||||||
|
};
|
||||||
|
|
||||||
return nodash;
|
function contains(obj, target) {
|
||||||
|
if (obj == null) return false;
|
||||||
|
if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
|
||||||
|
return any(obj, function(value) {
|
||||||
|
return value === target;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
});
|
function Wrapped(value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
Wrapped.prototype.has = function(key) {
|
||||||
|
return has(this.value, key);
|
||||||
|
};
|
||||||
|
Wrapped.prototype.contains = function(target) {
|
||||||
|
return contains(this.value, target);
|
||||||
|
};
|
||||||
|
Wrapped.prototype.size = function() {
|
||||||
|
return size(this.value);
|
||||||
|
};
|
||||||
|
|
||||||
|
function nodash(value) {
|
||||||
|
// don't wrap if already wrapped, even if wrapped by a different `lodash` constructor
|
||||||
|
return (value && typeof value == 'object' && !Array.isArray(value) && hasOwnProperty.call(value, '__wrapped__'))
|
||||||
|
? value
|
||||||
|
: new Wrapped(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = nodash;
|
||||||
|
|
31
lib/unzip.js
31
lib/unzip.js
|
@ -1,31 +0,0 @@
|
||||||
/** @license zlib.js 2012 - imaya [ https://github.com/imaya/zlib.js ] The MIT License */(function() {'use strict';function m(a){throw a;}var q=void 0,u,aa=this;function v(a,b){var c=a.split("."),d=aa;!(c[0]in d)&&d.execScript&&d.execScript("var "+c[0]);for(var f;c.length&&(f=c.shift());)!c.length&&b!==q?d[f]=b:d=d[f]?d[f]:d[f]={}};var w="undefined"!==typeof Uint8Array&&"undefined"!==typeof Uint16Array&&"undefined"!==typeof Uint32Array&&"undefined"!==typeof DataView;new (w?Uint8Array:Array)(256);var x;for(x=0;256>x;++x)for(var y=x,ba=7,y=y>>>1;y;y>>>=1)--ba;var z=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,
|
|
||||||
2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,
|
|
||||||
2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,
|
|
||||||
2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,
|
|
||||||
3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,
|
|
||||||
936918E3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117],B=w?new Uint32Array(z):z;function C(a){var b=a.length,c=0,d=Number.POSITIVE_INFINITY,f,h,k,e,g,l,p,s,r,A;for(s=0;s<b;++s)a[s]>c&&(c=a[s]),a[s]<d&&(d=a[s]);f=1<<c;h=new (w?Uint32Array:Array)(f);k=1;e=0;for(g=2;k<=c;){for(s=0;s<b;++s)if(a[s]===k){l=0;p=e;for(r=0;r<k;++r)l=l<<1|p&1,p>>=1;A=k<<16|s;for(r=l;r<f;r+=g)h[r]=A;++e}++k;e<<=1;g<<=1}return[h,c,d]};var D=[],E;for(E=0;288>E;E++)switch(!0){case 143>=E:D.push([E+48,8]);break;case 255>=E:D.push([E-144+400,9]);break;case 279>=E:D.push([E-256+0,7]);break;case 287>=E:D.push([E-280+192,8]);break;default:m("invalid literal: "+E)}
|
|
||||||
var ca=function(){function a(a){switch(!0){case 3===a:return[257,a-3,0];case 4===a:return[258,a-4,0];case 5===a:return[259,a-5,0];case 6===a:return[260,a-6,0];case 7===a:return[261,a-7,0];case 8===a:return[262,a-8,0];case 9===a:return[263,a-9,0];case 10===a:return[264,a-10,0];case 12>=a:return[265,a-11,1];case 14>=a:return[266,a-13,1];case 16>=a:return[267,a-15,1];case 18>=a:return[268,a-17,1];case 22>=a:return[269,a-19,2];case 26>=a:return[270,a-23,2];case 30>=a:return[271,a-27,2];case 34>=a:return[272,
|
|
||||||
a-31,2];case 42>=a:return[273,a-35,3];case 50>=a:return[274,a-43,3];case 58>=a:return[275,a-51,3];case 66>=a:return[276,a-59,3];case 82>=a:return[277,a-67,4];case 98>=a:return[278,a-83,4];case 114>=a:return[279,a-99,4];case 130>=a:return[280,a-115,4];case 162>=a:return[281,a-131,5];case 194>=a:return[282,a-163,5];case 226>=a:return[283,a-195,5];case 257>=a:return[284,a-227,5];case 258===a:return[285,a-258,0];default:m("invalid length: "+a)}}var b=[],c,d;for(c=3;258>=c;c++)d=a(c),b[c]=d[2]<<24|d[1]<<
|
|
||||||
16|d[0];return b}();w&&new Uint32Array(ca);function F(a,b){this.l=[];this.m=32768;this.d=this.f=this.c=this.t=0;this.input=w?new Uint8Array(a):a;this.u=!1;this.n=G;this.L=!1;if(b||!(b={}))b.index&&(this.c=b.index),b.bufferSize&&(this.m=b.bufferSize),b.bufferType&&(this.n=b.bufferType),b.resize&&(this.L=b.resize);switch(this.n){case H:this.a=32768;this.b=new (w?Uint8Array:Array)(32768+this.m+258);break;case G:this.a=0;this.b=new (w?Uint8Array:Array)(this.m);this.e=this.X;this.B=this.S;this.q=this.W;break;default:m(Error("invalid inflate mode"))}}
|
|
||||||
var H=0,G=1;
|
|
||||||
F.prototype.r=function(){for(;!this.u;){var a=I(this,3);a&1&&(this.u=!0);a>>>=1;switch(a){case 0:var b=this.input,c=this.c,d=this.b,f=this.a,h=b.length,k=q,e=q,g=d.length,l=q;this.d=this.f=0;c+1>=h&&m(Error("invalid uncompressed block header: LEN"));k=b[c++]|b[c++]<<8;c+1>=h&&m(Error("invalid uncompressed block header: NLEN"));e=b[c++]|b[c++]<<8;k===~e&&m(Error("invalid uncompressed block header: length verify"));c+k>b.length&&m(Error("input buffer is broken"));switch(this.n){case H:for(;f+k>d.length;){l=
|
|
||||||
g-f;k-=l;if(w)d.set(b.subarray(c,c+l),f),f+=l,c+=l;else for(;l--;)d[f++]=b[c++];this.a=f;d=this.e();f=this.a}break;case G:for(;f+k>d.length;)d=this.e({H:2});break;default:m(Error("invalid inflate mode"))}if(w)d.set(b.subarray(c,c+k),f),f+=k,c+=k;else for(;k--;)d[f++]=b[c++];this.c=c;this.a=f;this.b=d;break;case 1:this.q(da,ea);break;case 2:fa(this);break;default:m(Error("unknown BTYPE: "+a))}}return this.B()};
|
|
||||||
var J=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],K=w?new Uint16Array(J):J,L=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,258,258],M=w?new Uint16Array(L):L,ga=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0],O=w?new Uint8Array(ga):ga,ha=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],ia=w?new Uint16Array(ha):ha,ja=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,
|
|
||||||
12,12,13,13],P=w?new Uint8Array(ja):ja,Q=new (w?Uint8Array:Array)(288),R,la;R=0;for(la=Q.length;R<la;++R)Q[R]=143>=R?8:255>=R?9:279>=R?7:8;var da=C(Q),S=new (w?Uint8Array:Array)(30),T,ma;T=0;for(ma=S.length;T<ma;++T)S[T]=5;var ea=C(S);function I(a,b){for(var c=a.f,d=a.d,f=a.input,h=a.c,k=f.length,e;d<b;)h>=k&&m(Error("input buffer is broken")),c|=f[h++]<<d,d+=8;e=c&(1<<b)-1;a.f=c>>>b;a.d=d-b;a.c=h;return e}
|
|
||||||
function U(a,b){for(var c=a.f,d=a.d,f=a.input,h=a.c,k=f.length,e=b[0],g=b[1],l,p;d<g&&!(h>=k);)c|=f[h++]<<d,d+=8;l=e[c&(1<<g)-1];p=l>>>16;a.f=c>>p;a.d=d-p;a.c=h;return l&65535}
|
|
||||||
function fa(a){function b(a,b,c){var d,e=this.K,f,g;for(g=0;g<a;)switch(d=U(this,b),d){case 16:for(f=3+I(this,2);f--;)c[g++]=e;break;case 17:for(f=3+I(this,3);f--;)c[g++]=0;e=0;break;case 18:for(f=11+I(this,7);f--;)c[g++]=0;e=0;break;default:e=c[g++]=d}this.K=e;return c}var c=I(a,5)+257,d=I(a,5)+1,f=I(a,4)+4,h=new (w?Uint8Array:Array)(K.length),k,e,g,l;for(l=0;l<f;++l)h[K[l]]=I(a,3);if(!w){l=f;for(f=h.length;l<f;++l)h[K[l]]=0}k=C(h);e=new (w?Uint8Array:Array)(c);g=new (w?Uint8Array:Array)(d);a.K=
|
|
||||||
0;a.q(C(b.call(a,c,k,e)),C(b.call(a,d,k,g)))}u=F.prototype;u.q=function(a,b){var c=this.b,d=this.a;this.C=a;for(var f=c.length-258,h,k,e,g;256!==(h=U(this,a));)if(256>h)d>=f&&(this.a=d,c=this.e(),d=this.a),c[d++]=h;else{k=h-257;g=M[k];0<O[k]&&(g+=I(this,O[k]));h=U(this,b);e=ia[h];0<P[h]&&(e+=I(this,P[h]));d>=f&&(this.a=d,c=this.e(),d=this.a);for(;g--;)c[d]=c[d++-e]}for(;8<=this.d;)this.d-=8,this.c--;this.a=d};
|
|
||||||
u.W=function(a,b){var c=this.b,d=this.a;this.C=a;for(var f=c.length,h,k,e,g;256!==(h=U(this,a));)if(256>h)d>=f&&(c=this.e(),f=c.length),c[d++]=h;else{k=h-257;g=M[k];0<O[k]&&(g+=I(this,O[k]));h=U(this,b);e=ia[h];0<P[h]&&(e+=I(this,P[h]));d+g>f&&(c=this.e(),f=c.length);for(;g--;)c[d]=c[d++-e]}for(;8<=this.d;)this.d-=8,this.c--;this.a=d};
|
|
||||||
u.e=function(){var a=new (w?Uint8Array:Array)(this.a-32768),b=this.a-32768,c,d,f=this.b;if(w)a.set(f.subarray(32768,a.length));else{c=0;for(d=a.length;c<d;++c)a[c]=f[c+32768]}this.l.push(a);this.t+=a.length;if(w)f.set(f.subarray(b,b+32768));else for(c=0;32768>c;++c)f[c]=f[b+c];this.a=32768;return f};
|
|
||||||
u.X=function(a){var b,c=this.input.length/this.c+1|0,d,f,h,k=this.input,e=this.b;a&&("number"===typeof a.H&&(c=a.H),"number"===typeof a.Q&&(c+=a.Q));2>c?(d=(k.length-this.c)/this.C[2],h=258*(d/2)|0,f=h<e.length?e.length+h:e.length<<1):f=e.length*c;w?(b=new Uint8Array(f),b.set(e)):b=e;return this.b=b};
|
|
||||||
u.B=function(){var a=0,b=this.b,c=this.l,d,f=new (w?Uint8Array:Array)(this.t+(this.a-32768)),h,k,e,g;if(0===c.length)return w?this.b.subarray(32768,this.a):this.b.slice(32768,this.a);h=0;for(k=c.length;h<k;++h){d=c[h];e=0;for(g=d.length;e<g;++e)f[a++]=d[e]}h=32768;for(k=this.a;h<k;++h)f[a++]=b[h];this.l=[];return this.buffer=f};
|
|
||||||
u.S=function(){var a,b=this.a;w?this.L?(a=new Uint8Array(b),a.set(this.b.subarray(0,b))):a=this.b.subarray(0,b):(this.b.length>b&&(this.b.length=b),a=this.b);return this.buffer=a};function V(a){a=a||{};this.files=[];this.v=a.comment}V.prototype.M=function(a){this.j=a};V.prototype.s=function(a){var b=a[2]&65535|2;return b*(b^1)>>8&255};V.prototype.k=function(a,b){a[0]=(B[(a[0]^b)&255]^a[0]>>>8)>>>0;a[1]=(6681*(20173*(a[1]+(a[0]&255))>>>0)>>>0)+1>>>0;a[2]=(B[(a[2]^a[1]>>>24)&255]^a[2]>>>8)>>>0};V.prototype.U=function(a){var b=[305419896,591751049,878082192],c,d;w&&(b=new Uint32Array(b));c=0;for(d=a.length;c<d;++c)this.k(b,a[c]&255);return b};function W(a,b){b=b||{};this.input=w&&a instanceof Array?new Uint8Array(a):a;this.c=0;this.ca=b.verify||!1;this.j=b.password}var na={P:0,N:8},X=[80,75,1,2],Y=[80,75,3,4],Z=[80,75,5,6];function oa(a,b){this.input=a;this.offset=b}
|
|
||||||
oa.prototype.parse=function(){var a=this.input,b=this.offset;(a[b++]!==X[0]||a[b++]!==X[1]||a[b++]!==X[2]||a[b++]!==X[3])&&m(Error("invalid file header signature"));this.version=a[b++];this.ja=a[b++];this.$=a[b++]|a[b++]<<8;this.I=a[b++]|a[b++]<<8;this.A=a[b++]|a[b++]<<8;this.time=a[b++]|a[b++]<<8;this.V=a[b++]|a[b++]<<8;this.p=(a[b++]|a[b++]<<8|a[b++]<<16|a[b++]<<24)>>>0;this.z=(a[b++]|a[b++]<<8|a[b++]<<16|a[b++]<<24)>>>0;this.J=(a[b++]|a[b++]<<8|a[b++]<<16|a[b++]<<24)>>>0;this.h=a[b++]|a[b++]<<
|
|
||||||
8;this.g=a[b++]|a[b++]<<8;this.F=a[b++]|a[b++]<<8;this.fa=a[b++]|a[b++]<<8;this.ha=a[b++]|a[b++]<<8;this.ga=a[b++]|a[b++]<<8|a[b++]<<16|a[b++]<<24;this.aa=(a[b++]|a[b++]<<8|a[b++]<<16|a[b++]<<24)>>>0;this.filename=String.fromCharCode.apply(null,w?a.subarray(b,b+=this.h):a.slice(b,b+=this.h));this.Y=w?a.subarray(b,b+=this.g):a.slice(b,b+=this.g);this.v=w?a.subarray(b,b+this.F):a.slice(b,b+this.F);this.length=b-this.offset};function pa(a,b){this.input=a;this.offset=b}var qa={O:1,da:8,ea:2048};
|
|
||||||
pa.prototype.parse=function(){var a=this.input,b=this.offset;(a[b++]!==Y[0]||a[b++]!==Y[1]||a[b++]!==Y[2]||a[b++]!==Y[3])&&m(Error("invalid local file header signature"));this.$=a[b++]|a[b++]<<8;this.I=a[b++]|a[b++]<<8;this.A=a[b++]|a[b++]<<8;this.time=a[b++]|a[b++]<<8;this.V=a[b++]|a[b++]<<8;this.p=(a[b++]|a[b++]<<8|a[b++]<<16|a[b++]<<24)>>>0;this.z=(a[b++]|a[b++]<<8|a[b++]<<16|a[b++]<<24)>>>0;this.J=(a[b++]|a[b++]<<8|a[b++]<<16|a[b++]<<24)>>>0;this.h=a[b++]|a[b++]<<8;this.g=a[b++]|a[b++]<<8;this.filename=
|
|
||||||
String.fromCharCode.apply(null,w?a.subarray(b,b+=this.h):a.slice(b,b+=this.h));this.Y=w?a.subarray(b,b+=this.g):a.slice(b,b+=this.g);this.length=b-this.offset};
|
|
||||||
function $(a){var b=[],c={},d,f,h,k;if(!a.i){if(a.o===q){var e=a.input,g;if(!a.D)a:{var l=a.input,p;for(p=l.length-12;0<p;--p)if(l[p]===Z[0]&&l[p+1]===Z[1]&&l[p+2]===Z[2]&&l[p+3]===Z[3]){a.D=p;break a}m(Error("End of Central Directory Record not found"))}g=a.D;(e[g++]!==Z[0]||e[g++]!==Z[1]||e[g++]!==Z[2]||e[g++]!==Z[3])&&m(Error("invalid signature"));a.ia=e[g++]|e[g++]<<8;a.ka=e[g++]|e[g++]<<8;a.la=e[g++]|e[g++]<<8;a.ba=e[g++]|e[g++]<<8;a.R=(e[g++]|e[g++]<<8|e[g++]<<16|e[g++]<<24)>>>0;a.o=(e[g++]|
|
|
||||||
e[g++]<<8|e[g++]<<16|e[g++]<<24)>>>0;a.w=e[g++]|e[g++]<<8;a.v=w?e.subarray(g,g+a.w):e.slice(g,g+a.w)}d=a.o;h=0;for(k=a.ba;h<k;++h)f=new oa(a.input,d),f.parse(),d+=f.length,b[h]=f,c[f.filename]=h;a.R<d-a.o&&m(Error("invalid file header size"));a.i=b;a.G=c}}u=W.prototype;u.Z=function(){var a=[],b,c,d;this.i||$(this);d=this.i;b=0;for(c=d.length;b<c;++b)a[b]=d[b].filename;return a};
|
|
||||||
u.r=function(a,b){var c;this.G||$(this);c=this.G[a];c===q&&m(Error(a+" not found"));var d;d=b||{};var f=this.input,h=this.i,k,e,g,l,p,s,r,A;h||$(this);h[c]===q&&m(Error("wrong index"));e=h[c].aa;k=new pa(this.input,e);k.parse();e+=k.length;g=k.z;if(0!==(k.I&qa.O)){!d.password&&!this.j&&m(Error("please set password"));s=this.T(d.password||this.j);r=e;for(A=e+12;r<A;++r)ra(this,s,f[r]);e+=12;g-=12;r=e;for(A=e+g;r<A;++r)f[r]=ra(this,s,f[r])}switch(k.A){case na.P:l=w?this.input.subarray(e,e+g):this.input.slice(e,
|
|
||||||
e+g);break;case na.N:l=(new F(this.input,{index:e,bufferSize:k.J})).r();break;default:m(Error("unknown compression type"))}if(this.ca){var t=q,n,N="number"===typeof t?t:t=0,ka=l.length;n=-1;for(N=ka&7;N--;++t)n=n>>>8^B[(n^l[t])&255];for(N=ka>>3;N--;t+=8)n=n>>>8^B[(n^l[t])&255],n=n>>>8^B[(n^l[t+1])&255],n=n>>>8^B[(n^l[t+2])&255],n=n>>>8^B[(n^l[t+3])&255],n=n>>>8^B[(n^l[t+4])&255],n=n>>>8^B[(n^l[t+5])&255],n=n>>>8^B[(n^l[t+6])&255],n=n>>>8^B[(n^l[t+7])&255];p=(n^4294967295)>>>0;k.p!==p&&m(Error("wrong crc: file=0x"+
|
|
||||||
k.p.toString(16)+", data=0x"+p.toString(16)))}return l};u.M=function(a){this.j=a};function ra(a,b,c){c^=a.s(b);a.k(b,c);return c}u.k=V.prototype.k;u.T=V.prototype.U;u.s=V.prototype.s;v("Zlib.Unzip",W);v("Zlib.Unzip.prototype.decompress",W.prototype.r);v("Zlib.Unzip.prototype.getFilenames",W.prototype.Z);v("Zlib.Unzip.prototype.setPassword",W.prototype.M);}).call(this);
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
var ZlibNamespace = {};
|
||||||
|
|
||||||
/** @license zlib.js 2012 - imaya [ https://github.com/imaya/zlib.js ] The MIT License */(function() {'use strict';var n=void 0,y=!0,aa=this;function G(e,b){var a=e.split("."),d=aa;!(a[0]in d)&&d.execScript&&d.execScript("var "+a[0]);for(var c;a.length&&(c=a.shift());)!a.length&&b!==n?d[c]=b:d=d[c]?d[c]:d[c]={}};var H="undefined"!==typeof Uint8Array&&"undefined"!==typeof Uint16Array&&"undefined"!==typeof Uint32Array&&"undefined"!==typeof DataView;function ba(e,b){this.index="number"===typeof b?b:0;this.f=0;this.buffer=e instanceof(H?Uint8Array:Array)?e:new (H?Uint8Array:Array)(32768);if(2*this.buffer.length<=this.index)throw Error("invalid index");this.buffer.length<=this.index&&ca(this)}function ca(e){var b=e.buffer,a,d=b.length,c=new (H?Uint8Array:Array)(d<<1);if(H)c.set(b);else for(a=0;a<d;++a)c[a]=b[a];return e.buffer=c}
|
/** @license zlib.js 2012 - imaya [ https://github.com/imaya/zlib.js ] The MIT License */(function() {'use strict';var n=void 0,y=!0,aa=this;function G(e,b){var a=e.split("."),d=aa;!(a[0]in d)&&d.execScript&&d.execScript("var "+a[0]);for(var c;a.length&&(c=a.shift());)!a.length&&b!==n?d[c]=b:d=d[c]?d[c]:d[c]={}};var H="undefined"!==typeof Uint8Array&&"undefined"!==typeof Uint16Array&&"undefined"!==typeof Uint32Array&&"undefined"!==typeof DataView;function ba(e,b){this.index="number"===typeof b?b:0;this.f=0;this.buffer=e instanceof(H?Uint8Array:Array)?e:new (H?Uint8Array:Array)(32768);if(2*this.buffer.length<=this.index)throw Error("invalid index");this.buffer.length<=this.index&&ca(this)}function ca(e){var b=e.buffer,a,d=b.length,c=new (H?Uint8Array:Array)(d<<1);if(H)c.set(b);else for(a=0;a<d;++a)c[a]=b[a];return e.buffer=c}
|
||||||
ba.prototype.b=function(e,b,a){var d=this.buffer,c=this.index,f=this.f,l=d[c],p;a&&1<b&&(e=8<b?(L[e&255]<<24|L[e>>>8&255]<<16|L[e>>>16&255]<<8|L[e>>>24&255])>>32-b:L[e]>>8-b);if(8>b+f)l=l<<b|e,f+=b;else for(p=0;p<b;++p)l=l<<1|e>>b-p-1&1,8===++f&&(f=0,d[c++]=L[l],l=0,c===d.length&&(d=ca(this)));d[c]=l;this.buffer=d;this.f=f;this.index=c};ba.prototype.finish=function(){var e=this.buffer,b=this.index,a;0<this.f&&(e[b]<<=8-this.f,e[b]=L[e[b]],b++);H?a=e.subarray(0,b):(e.length=b,a=e);return a};
|
ba.prototype.b=function(e,b,a){var d=this.buffer,c=this.index,f=this.f,l=d[c],p;a&&1<b&&(e=8<b?(L[e&255]<<24|L[e>>>8&255]<<16|L[e>>>16&255]<<8|L[e>>>24&255])>>32-b:L[e]>>8-b);if(8>b+f)l=l<<b|e,f+=b;else for(p=0;p<b;++p)l=l<<1|e>>b-p-1&1,8===++f&&(f=0,d[c++]=L[l],l=0,c===d.length&&(d=ca(this)));d[c]=l;this.buffer=d;this.f=f;this.index=c};ba.prototype.finish=function(){var e=this.buffer,b=this.index,a;0<this.f&&(e[b]<<=8-this.f,e[b]=L[e[b]],b++);H?a=e.subarray(0,b):(e.length=b,a=e);return a};
|
||||||
var da=new (H?Uint8Array:Array)(256),ha;for(ha=0;256>ha;++ha){for(var U=ha,ja=U,ka=7,U=U>>>1;U;U>>>=1)ja<<=1,ja|=U&1,--ka;da[ha]=(ja<<ka&255)>>>0}var L=da;function la(e){var b=n,a,d="number"===typeof b?b:b=0,c=e.length;a=-1;for(d=c&7;d--;++b)a=a>>>8^V[(a^e[b])&255];for(d=c>>3;d--;b+=8)a=a>>>8^V[(a^e[b])&255],a=a>>>8^V[(a^e[b+1])&255],a=a>>>8^V[(a^e[b+2])&255],a=a>>>8^V[(a^e[b+3])&255],a=a>>>8^V[(a^e[b+4])&255],a=a>>>8^V[(a^e[b+5])&255],a=a>>>8^V[(a^e[b+6])&255],a=a>>>8^V[(a^e[b+7])&255];return(a^4294967295)>>>0}
|
var da=new (H?Uint8Array:Array)(256),ha;for(ha=0;256>ha;++ha){for(var U=ha,ja=U,ka=7,U=U>>>1;U;U>>>=1)ja<<=1,ja|=U&1,--ka;da[ha]=(ja<<ka&255)>>>0}var L=da;function la(e){var b=n,a,d="number"===typeof b?b:b=0,c=e.length;a=-1;for(d=c&7;d--;++b)a=a>>>8^V[(a^e[b])&255];for(d=c>>3;d--;b+=8)a=a>>>8^V[(a^e[b])&255],a=a>>>8^V[(a^e[b+1])&255],a=a>>>8^V[(a^e[b+2])&255],a=a>>>8^V[(a^e[b+3])&255],a=a>>>8^V[(a^e[b+4])&255],a=a>>>8^V[(a^e[b+5])&255],a=a>>>8^V[(a^e[b+6])&255],a=a>>>8^V[(a^e[b+7])&255];return(a^4294967295)>>>0}
|
||||||
|
@ -34,4 +36,38 @@ W=n,X=n;H&&(O=new Uint32Array(O));W=0;for(X=ea.length;W<X;++W)Pa(O,ea[W]&255);N=
|
||||||
1980&127)<<1|u.getMonth()+1>>3;m=b.h;a[d++]=a[c++]=m&255;a[d++]=a[c++]=m>>8&255;a[d++]=a[c++]=m>>16&255;a[d++]=a[c++]=m>>24&255;h=b.buffer.length;a[d++]=a[c++]=h&255;a[d++]=a[c++]=h>>8&255;a[d++]=a[c++]=h>>16&255;a[d++]=a[c++]=h>>24&255;s=b.size;a[d++]=a[c++]=s&255;a[d++]=a[c++]=s>>8&255;a[d++]=a[c++]=s>>16&255;a[d++]=a[c++]=s>>24&255;a[d++]=a[c++]=t&255;a[d++]=a[c++]=t>>8&255;a[d++]=a[c++]=0;a[d++]=a[c++]=0;a[c++]=r&255;a[c++]=r>>8&255;a[c++]=0;a[c++]=0;a[c++]=0;a[c++]=0;a[c++]=0;a[c++]=0;a[c++]=
|
1980&127)<<1|u.getMonth()+1>>3;m=b.h;a[d++]=a[c++]=m&255;a[d++]=a[c++]=m>>8&255;a[d++]=a[c++]=m>>16&255;a[d++]=a[c++]=m>>24&255;h=b.buffer.length;a[d++]=a[c++]=h&255;a[d++]=a[c++]=h>>8&255;a[d++]=a[c++]=h>>16&255;a[d++]=a[c++]=h>>24&255;s=b.size;a[d++]=a[c++]=s&255;a[d++]=a[c++]=s>>8&255;a[d++]=a[c++]=s>>16&255;a[d++]=a[c++]=s>>24&255;a[d++]=a[c++]=t&255;a[d++]=a[c++]=t>>8&255;a[d++]=a[c++]=0;a[d++]=a[c++]=0;a[c++]=r&255;a[c++]=r>>8&255;a[c++]=0;a[c++]=0;a[c++]=0;a[c++]=0;a[c++]=0;a[c++]=0;a[c++]=
|
||||||
0;a[c++]=0;a[c++]=k&255;a[c++]=k>>8&255;a[c++]=k>>16&255;a[c++]=k>>24&255;if(Q=b.a.filename)if(H)a.set(Q,d),a.set(Q,c),d+=t,c+=t;else for(g=0;g<t;++g)a[d++]=a[c++]=Q[g];if(z=b.a.extraField)if(H)a.set(z,d),a.set(z,c),d+=0,c+=0;else for(g=0;g<r;++g)a[d++]=a[c++]=z[g];if(A=b.a.comment)if(H)a.set(A,c),c+=r;else for(g=0;g<r;++g)a[c++]=A[g];if(H)a.set(b.buffer,d),d+=b.buffer.length;else{g=0;for(J=b.buffer.length;g<J;++g)a[d++]=b.buffer[g]}}a[f++]=Oa[0];a[f++]=Oa[1];a[f++]=Oa[2];a[f++]=Oa[3];a[f++]=0;a[f++]=
|
0;a[c++]=0;a[c++]=k&255;a[c++]=k>>8&255;a[c++]=k>>16&255;a[c++]=k>>24&255;if(Q=b.a.filename)if(H)a.set(Q,d),a.set(Q,c),d+=t,c+=t;else for(g=0;g<t;++g)a[d++]=a[c++]=Q[g];if(z=b.a.extraField)if(H)a.set(z,d),a.set(z,c),d+=0,c+=0;else for(g=0;g<r;++g)a[d++]=a[c++]=z[g];if(A=b.a.comment)if(H)a.set(A,c),c+=r;else for(g=0;g<r;++g)a[c++]=A[g];if(H)a.set(b.buffer,d),d+=b.buffer.length;else{g=0;for(J=b.buffer.length;g<J;++g)a[d++]=b.buffer[g]}}a[f++]=Oa[0];a[f++]=Oa[1];a[f++]=Oa[2];a[f++]=Oa[3];a[f++]=0;a[f++]=
|
||||||
0;a[f++]=0;a[f++]=0;a[f++]=C&255;a[f++]=C>>8&255;a[f++]=C&255;a[f++]=C>>8&255;a[f++]=p&255;a[f++]=p>>8&255;a[f++]=p>>16&255;a[f++]=p>>24&255;a[f++]=l&255;a[f++]=l>>8&255;a[f++]=l>>16&255;a[f++]=l>>24&255;r=this.d?this.d.length:0;a[f++]=r&255;a[f++]=r>>8&255;if(this.d)if(H)a.set(this.d,f);else{g=0;for(J=r;g<J;++g)a[f++]=this.d[g]}return a};function Qa(e,b){var a,d=e[2]&65535|2;a=d*(d^1)>>8&255;Pa(e,b);return a^b}
|
0;a[f++]=0;a[f++]=0;a[f++]=C&255;a[f++]=C>>8&255;a[f++]=C&255;a[f++]=C>>8&255;a[f++]=p&255;a[f++]=p>>8&255;a[f++]=p>>16&255;a[f++]=p>>24&255;a[f++]=l&255;a[f++]=l>>8&255;a[f++]=l>>16&255;a[f++]=l>>24&255;r=this.d?this.d.length:0;a[f++]=r&255;a[f++]=r>>8&255;if(this.d)if(H)a.set(this.d,f);else{g=0;for(J=r;g<J;++g)a[f++]=this.d[g]}return a};function Qa(e,b){var a,d=e[2]&65535|2;a=d*(d^1)>>8&255;Pa(e,b);return a^b}
|
||||||
function Pa(e,b){e[0]=(V[(e[0]^b)&255]^e[0]>>>8)>>>0;e[1]=(6681*(20173*(e[1]+(e[0]&255))>>>0)>>>0)+1>>>0;e[2]=(V[(e[2]^e[1]>>>24)&255]^e[2]>>>8)>>>0};function Ra(e,b){var a,d,c,f;if(Object.keys)a=Object.keys(b);else for(d in a=[],c=0,b)a[c++]=d;c=0;for(f=a.length;c<f;++c)d=a[c],G(e+"."+d,b[d])};G("Zlib.Zip",$);G("Zlib.Zip.prototype.addFile",$.prototype.m);G("Zlib.Zip.prototype.compress",$.prototype.g);G("Zlib.Zip.prototype.setPassword",$.prototype.q);Ra("Zlib.Zip.CompressionMethod",{STORE:0,DEFLATE:8});Ra("Zlib.Zip.OperatingSystem",{MSDOS:0,UNIX:3,MACINTOSH:7});}).call(this);
|
function Pa(e,b){e[0]=(V[(e[0]^b)&255]^e[0]>>>8)>>>0;e[1]=(6681*(20173*(e[1]+(e[0]&255))>>>0)>>>0)+1>>>0;e[2]=(V[(e[2]^e[1]>>>24)&255]^e[2]>>>8)>>>0};function Ra(e,b){var a,d,c,f;if(Object.keys)a=Object.keys(b);else for(d in a=[],c=0,b)a[c++]=d;c=0;for(f=a.length;c<f;++c)d=a[c],G(e+"."+d,b[d])};G("Zlib.Zip",$);G("Zlib.Zip.prototype.addFile",$.prototype.m);G("Zlib.Zip.prototype.compress",$.prototype.g);G("Zlib.Zip.prototype.setPassword",$.prototype.q);Ra("Zlib.Zip.CompressionMethod",{STORE:0,DEFLATE:8});Ra("Zlib.Zip.OperatingSystem",{MSDOS:0,UNIX:3,MACINTOSH:7});}).call(ZlibNamespace);
|
||||||
|
|
||||||
|
/** @license zlib.js 2012 - imaya [ https://github.com/imaya/zlib.js ] The MIT License */(function() {'use strict';function m(a){throw a;}var q=void 0,u,aa=this;function v(a,b){var c=a.split("."),d=aa;!(c[0]in d)&&d.execScript&&d.execScript("var "+c[0]);for(var f;c.length&&(f=c.shift());)!c.length&&b!==q?d[f]=b:d=d[f]?d[f]:d[f]={}};var w="undefined"!==typeof Uint8Array&&"undefined"!==typeof Uint16Array&&"undefined"!==typeof Uint32Array&&"undefined"!==typeof DataView;new (w?Uint8Array:Array)(256);var x;for(x=0;256>x;++x)for(var y=x,ba=7,y=y>>>1;y;y>>>=1)--ba;var z=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,
|
||||||
|
2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,
|
||||||
|
2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,
|
||||||
|
2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,
|
||||||
|
3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,
|
||||||
|
936918E3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117],B=w?new Uint32Array(z):z;function C(a){var b=a.length,c=0,d=Number.POSITIVE_INFINITY,f,h,k,e,g,l,p,s,r,A;for(s=0;s<b;++s)a[s]>c&&(c=a[s]),a[s]<d&&(d=a[s]);f=1<<c;h=new (w?Uint32Array:Array)(f);k=1;e=0;for(g=2;k<=c;){for(s=0;s<b;++s)if(a[s]===k){l=0;p=e;for(r=0;r<k;++r)l=l<<1|p&1,p>>=1;A=k<<16|s;for(r=l;r<f;r+=g)h[r]=A;++e}++k;e<<=1;g<<=1}return[h,c,d]};var D=[],E;for(E=0;288>E;E++)switch(!0){case 143>=E:D.push([E+48,8]);break;case 255>=E:D.push([E-144+400,9]);break;case 279>=E:D.push([E-256+0,7]);break;case 287>=E:D.push([E-280+192,8]);break;default:m("invalid literal: "+E)}
|
||||||
|
var ca=function(){function a(a){switch(!0){case 3===a:return[257,a-3,0];case 4===a:return[258,a-4,0];case 5===a:return[259,a-5,0];case 6===a:return[260,a-6,0];case 7===a:return[261,a-7,0];case 8===a:return[262,a-8,0];case 9===a:return[263,a-9,0];case 10===a:return[264,a-10,0];case 12>=a:return[265,a-11,1];case 14>=a:return[266,a-13,1];case 16>=a:return[267,a-15,1];case 18>=a:return[268,a-17,1];case 22>=a:return[269,a-19,2];case 26>=a:return[270,a-23,2];case 30>=a:return[271,a-27,2];case 34>=a:return[272,
|
||||||
|
a-31,2];case 42>=a:return[273,a-35,3];case 50>=a:return[274,a-43,3];case 58>=a:return[275,a-51,3];case 66>=a:return[276,a-59,3];case 82>=a:return[277,a-67,4];case 98>=a:return[278,a-83,4];case 114>=a:return[279,a-99,4];case 130>=a:return[280,a-115,4];case 162>=a:return[281,a-131,5];case 194>=a:return[282,a-163,5];case 226>=a:return[283,a-195,5];case 257>=a:return[284,a-227,5];case 258===a:return[285,a-258,0];default:m("invalid length: "+a)}}var b=[],c,d;for(c=3;258>=c;c++)d=a(c),b[c]=d[2]<<24|d[1]<<
|
||||||
|
16|d[0];return b}();w&&new Uint32Array(ca);function F(a,b){this.l=[];this.m=32768;this.d=this.f=this.c=this.t=0;this.input=w?new Uint8Array(a):a;this.u=!1;this.n=G;this.L=!1;if(b||!(b={}))b.index&&(this.c=b.index),b.bufferSize&&(this.m=b.bufferSize),b.bufferType&&(this.n=b.bufferType),b.resize&&(this.L=b.resize);switch(this.n){case H:this.a=32768;this.b=new (w?Uint8Array:Array)(32768+this.m+258);break;case G:this.a=0;this.b=new (w?Uint8Array:Array)(this.m);this.e=this.X;this.B=this.S;this.q=this.W;break;default:m(Error("invalid inflate mode"))}}
|
||||||
|
var H=0,G=1;
|
||||||
|
F.prototype.r=function(){for(;!this.u;){var a=I(this,3);a&1&&(this.u=!0);a>>>=1;switch(a){case 0:var b=this.input,c=this.c,d=this.b,f=this.a,h=b.length,k=q,e=q,g=d.length,l=q;this.d=this.f=0;c+1>=h&&m(Error("invalid uncompressed block header: LEN"));k=b[c++]|b[c++]<<8;c+1>=h&&m(Error("invalid uncompressed block header: NLEN"));e=b[c++]|b[c++]<<8;k===~e&&m(Error("invalid uncompressed block header: length verify"));c+k>b.length&&m(Error("input buffer is broken"));switch(this.n){case H:for(;f+k>d.length;){l=
|
||||||
|
g-f;k-=l;if(w)d.set(b.subarray(c,c+l),f),f+=l,c+=l;else for(;l--;)d[f++]=b[c++];this.a=f;d=this.e();f=this.a}break;case G:for(;f+k>d.length;)d=this.e({H:2});break;default:m(Error("invalid inflate mode"))}if(w)d.set(b.subarray(c,c+k),f),f+=k,c+=k;else for(;k--;)d[f++]=b[c++];this.c=c;this.a=f;this.b=d;break;case 1:this.q(da,ea);break;case 2:fa(this);break;default:m(Error("unknown BTYPE: "+a))}}return this.B()};
|
||||||
|
var J=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],K=w?new Uint16Array(J):J,L=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,258,258],M=w?new Uint16Array(L):L,ga=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0],O=w?new Uint8Array(ga):ga,ha=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],ia=w?new Uint16Array(ha):ha,ja=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,
|
||||||
|
12,12,13,13],P=w?new Uint8Array(ja):ja,Q=new (w?Uint8Array:Array)(288),R,la;R=0;for(la=Q.length;R<la;++R)Q[R]=143>=R?8:255>=R?9:279>=R?7:8;var da=C(Q),S=new (w?Uint8Array:Array)(30),T,ma;T=0;for(ma=S.length;T<ma;++T)S[T]=5;var ea=C(S);function I(a,b){for(var c=a.f,d=a.d,f=a.input,h=a.c,k=f.length,e;d<b;)h>=k&&m(Error("input buffer is broken")),c|=f[h++]<<d,d+=8;e=c&(1<<b)-1;a.f=c>>>b;a.d=d-b;a.c=h;return e}
|
||||||
|
function U(a,b){for(var c=a.f,d=a.d,f=a.input,h=a.c,k=f.length,e=b[0],g=b[1],l,p;d<g&&!(h>=k);)c|=f[h++]<<d,d+=8;l=e[c&(1<<g)-1];p=l>>>16;a.f=c>>p;a.d=d-p;a.c=h;return l&65535}
|
||||||
|
function fa(a){function b(a,b,c){var d,e=this.K,f,g;for(g=0;g<a;)switch(d=U(this,b),d){case 16:for(f=3+I(this,2);f--;)c[g++]=e;break;case 17:for(f=3+I(this,3);f--;)c[g++]=0;e=0;break;case 18:for(f=11+I(this,7);f--;)c[g++]=0;e=0;break;default:e=c[g++]=d}this.K=e;return c}var c=I(a,5)+257,d=I(a,5)+1,f=I(a,4)+4,h=new (w?Uint8Array:Array)(K.length),k,e,g,l;for(l=0;l<f;++l)h[K[l]]=I(a,3);if(!w){l=f;for(f=h.length;l<f;++l)h[K[l]]=0}k=C(h);e=new (w?Uint8Array:Array)(c);g=new (w?Uint8Array:Array)(d);a.K=
|
||||||
|
0;a.q(C(b.call(a,c,k,e)),C(b.call(a,d,k,g)))}u=F.prototype;u.q=function(a,b){var c=this.b,d=this.a;this.C=a;for(var f=c.length-258,h,k,e,g;256!==(h=U(this,a));)if(256>h)d>=f&&(this.a=d,c=this.e(),d=this.a),c[d++]=h;else{k=h-257;g=M[k];0<O[k]&&(g+=I(this,O[k]));h=U(this,b);e=ia[h];0<P[h]&&(e+=I(this,P[h]));d>=f&&(this.a=d,c=this.e(),d=this.a);for(;g--;)c[d]=c[d++-e]}for(;8<=this.d;)this.d-=8,this.c--;this.a=d};
|
||||||
|
u.W=function(a,b){var c=this.b,d=this.a;this.C=a;for(var f=c.length,h,k,e,g;256!==(h=U(this,a));)if(256>h)d>=f&&(c=this.e(),f=c.length),c[d++]=h;else{k=h-257;g=M[k];0<O[k]&&(g+=I(this,O[k]));h=U(this,b);e=ia[h];0<P[h]&&(e+=I(this,P[h]));d+g>f&&(c=this.e(),f=c.length);for(;g--;)c[d]=c[d++-e]}for(;8<=this.d;)this.d-=8,this.c--;this.a=d};
|
||||||
|
u.e=function(){var a=new (w?Uint8Array:Array)(this.a-32768),b=this.a-32768,c,d,f=this.b;if(w)a.set(f.subarray(32768,a.length));else{c=0;for(d=a.length;c<d;++c)a[c]=f[c+32768]}this.l.push(a);this.t+=a.length;if(w)f.set(f.subarray(b,b+32768));else for(c=0;32768>c;++c)f[c]=f[b+c];this.a=32768;return f};
|
||||||
|
u.X=function(a){var b,c=this.input.length/this.c+1|0,d,f,h,k=this.input,e=this.b;a&&("number"===typeof a.H&&(c=a.H),"number"===typeof a.Q&&(c+=a.Q));2>c?(d=(k.length-this.c)/this.C[2],h=258*(d/2)|0,f=h<e.length?e.length+h:e.length<<1):f=e.length*c;w?(b=new Uint8Array(f),b.set(e)):b=e;return this.b=b};
|
||||||
|
u.B=function(){var a=0,b=this.b,c=this.l,d,f=new (w?Uint8Array:Array)(this.t+(this.a-32768)),h,k,e,g;if(0===c.length)return w?this.b.subarray(32768,this.a):this.b.slice(32768,this.a);h=0;for(k=c.length;h<k;++h){d=c[h];e=0;for(g=d.length;e<g;++e)f[a++]=d[e]}h=32768;for(k=this.a;h<k;++h)f[a++]=b[h];this.l=[];return this.buffer=f};
|
||||||
|
u.S=function(){var a,b=this.a;w?this.L?(a=new Uint8Array(b),a.set(this.b.subarray(0,b))):a=this.b.subarray(0,b):(this.b.length>b&&(this.b.length=b),a=this.b);return this.buffer=a};function V(a){a=a||{};this.files=[];this.v=a.comment}V.prototype.M=function(a){this.j=a};V.prototype.s=function(a){var b=a[2]&65535|2;return b*(b^1)>>8&255};V.prototype.k=function(a,b){a[0]=(B[(a[0]^b)&255]^a[0]>>>8)>>>0;a[1]=(6681*(20173*(a[1]+(a[0]&255))>>>0)>>>0)+1>>>0;a[2]=(B[(a[2]^a[1]>>>24)&255]^a[2]>>>8)>>>0};V.prototype.U=function(a){var b=[305419896,591751049,878082192],c,d;w&&(b=new Uint32Array(b));c=0;for(d=a.length;c<d;++c)this.k(b,a[c]&255);return b};function W(a,b){b=b||{};this.input=w&&a instanceof Array?new Uint8Array(a):a;this.c=0;this.ca=b.verify||!1;this.j=b.password}var na={P:0,N:8},X=[80,75,1,2],Y=[80,75,3,4],Z=[80,75,5,6];function oa(a,b){this.input=a;this.offset=b}
|
||||||
|
oa.prototype.parse=function(){var a=this.input,b=this.offset;(a[b++]!==X[0]||a[b++]!==X[1]||a[b++]!==X[2]||a[b++]!==X[3])&&m(Error("invalid file header signature"));this.version=a[b++];this.ja=a[b++];this.$=a[b++]|a[b++]<<8;this.I=a[b++]|a[b++]<<8;this.A=a[b++]|a[b++]<<8;this.time=a[b++]|a[b++]<<8;this.V=a[b++]|a[b++]<<8;this.p=(a[b++]|a[b++]<<8|a[b++]<<16|a[b++]<<24)>>>0;this.z=(a[b++]|a[b++]<<8|a[b++]<<16|a[b++]<<24)>>>0;this.J=(a[b++]|a[b++]<<8|a[b++]<<16|a[b++]<<24)>>>0;this.h=a[b++]|a[b++]<<
|
||||||
|
8;this.g=a[b++]|a[b++]<<8;this.F=a[b++]|a[b++]<<8;this.fa=a[b++]|a[b++]<<8;this.ha=a[b++]|a[b++]<<8;this.ga=a[b++]|a[b++]<<8|a[b++]<<16|a[b++]<<24;this.aa=(a[b++]|a[b++]<<8|a[b++]<<16|a[b++]<<24)>>>0;this.filename=String.fromCharCode.apply(null,w?a.subarray(b,b+=this.h):a.slice(b,b+=this.h));this.Y=w?a.subarray(b,b+=this.g):a.slice(b,b+=this.g);this.v=w?a.subarray(b,b+this.F):a.slice(b,b+this.F);this.length=b-this.offset};function pa(a,b){this.input=a;this.offset=b}var qa={O:1,da:8,ea:2048};
|
||||||
|
pa.prototype.parse=function(){var a=this.input,b=this.offset;(a[b++]!==Y[0]||a[b++]!==Y[1]||a[b++]!==Y[2]||a[b++]!==Y[3])&&m(Error("invalid local file header signature"));this.$=a[b++]|a[b++]<<8;this.I=a[b++]|a[b++]<<8;this.A=a[b++]|a[b++]<<8;this.time=a[b++]|a[b++]<<8;this.V=a[b++]|a[b++]<<8;this.p=(a[b++]|a[b++]<<8|a[b++]<<16|a[b++]<<24)>>>0;this.z=(a[b++]|a[b++]<<8|a[b++]<<16|a[b++]<<24)>>>0;this.J=(a[b++]|a[b++]<<8|a[b++]<<16|a[b++]<<24)>>>0;this.h=a[b++]|a[b++]<<8;this.g=a[b++]|a[b++]<<8;this.filename=
|
||||||
|
String.fromCharCode.apply(null,w?a.subarray(b,b+=this.h):a.slice(b,b+=this.h));this.Y=w?a.subarray(b,b+=this.g):a.slice(b,b+=this.g);this.length=b-this.offset};
|
||||||
|
function $(a){var b=[],c={},d,f,h,k;if(!a.i){if(a.o===q){var e=a.input,g;if(!a.D)a:{var l=a.input,p;for(p=l.length-12;0<p;--p)if(l[p]===Z[0]&&l[p+1]===Z[1]&&l[p+2]===Z[2]&&l[p+3]===Z[3]){a.D=p;break a}m(Error("End of Central Directory Record not found"))}g=a.D;(e[g++]!==Z[0]||e[g++]!==Z[1]||e[g++]!==Z[2]||e[g++]!==Z[3])&&m(Error("invalid signature"));a.ia=e[g++]|e[g++]<<8;a.ka=e[g++]|e[g++]<<8;a.la=e[g++]|e[g++]<<8;a.ba=e[g++]|e[g++]<<8;a.R=(e[g++]|e[g++]<<8|e[g++]<<16|e[g++]<<24)>>>0;a.o=(e[g++]|
|
||||||
|
e[g++]<<8|e[g++]<<16|e[g++]<<24)>>>0;a.w=e[g++]|e[g++]<<8;a.v=w?e.subarray(g,g+a.w):e.slice(g,g+a.w)}d=a.o;h=0;for(k=a.ba;h<k;++h)f=new oa(a.input,d),f.parse(),d+=f.length,b[h]=f,c[f.filename]=h;a.R<d-a.o&&m(Error("invalid file header size"));a.i=b;a.G=c}}u=W.prototype;u.Z=function(){var a=[],b,c,d;this.i||$(this);d=this.i;b=0;for(c=d.length;b<c;++b)a[b]=d[b].filename;return a};
|
||||||
|
u.r=function(a,b){var c;this.G||$(this);c=this.G[a];c===q&&m(Error(a+" not found"));var d;d=b||{};var f=this.input,h=this.i,k,e,g,l,p,s,r,A;h||$(this);h[c]===q&&m(Error("wrong index"));e=h[c].aa;k=new pa(this.input,e);k.parse();e+=k.length;g=k.z;if(0!==(k.I&qa.O)){!d.password&&!this.j&&m(Error("please set password"));s=this.T(d.password||this.j);r=e;for(A=e+12;r<A;++r)ra(this,s,f[r]);e+=12;g-=12;r=e;for(A=e+g;r<A;++r)f[r]=ra(this,s,f[r])}switch(k.A){case na.P:l=w?this.input.subarray(e,e+g):this.input.slice(e,
|
||||||
|
e+g);break;case na.N:l=(new F(this.input,{index:e,bufferSize:k.J})).r();break;default:m(Error("unknown compression type"))}if(this.ca){var t=q,n,N="number"===typeof t?t:t=0,ka=l.length;n=-1;for(N=ka&7;N--;++t)n=n>>>8^B[(n^l[t])&255];for(N=ka>>3;N--;t+=8)n=n>>>8^B[(n^l[t])&255],n=n>>>8^B[(n^l[t+1])&255],n=n>>>8^B[(n^l[t+2])&255],n=n>>>8^B[(n^l[t+3])&255],n=n>>>8^B[(n^l[t+4])&255],n=n>>>8^B[(n^l[t+5])&255],n=n>>>8^B[(n^l[t+6])&255],n=n>>>8^B[(n^l[t+7])&255];p=(n^4294967295)>>>0;k.p!==p&&m(Error("wrong crc: file=0x"+
|
||||||
|
k.p.toString(16)+", data=0x"+p.toString(16)))}return l};u.M=function(a){this.j=a};function ra(a,b,c){c^=a.s(b);a.k(b,c);return c}u.k=V.prototype.k;u.T=V.prototype.U;u.s=V.prototype.s;v("Zlib.Unzip",W);v("Zlib.Unzip.prototype.decompress",W.prototype.r);v("Zlib.Unzip.prototype.getFilenames",W.prototype.Z);v("Zlib.Unzip.prototype.setPassword",W.prototype.M);}).call(ZlibNamespace);
|
||||||
|
|
||||||
|
module.exports = ZlibNamespace;
|
|
@ -51,5 +51,5 @@
|
||||||
"mocha": "~1.18.2",
|
"mocha": "~1.18.2",
|
||||||
"requirejs": "~2.1.11"
|
"requirejs": "~2.1.11"
|
||||||
},
|
},
|
||||||
"main": "dist/filer_node.js"
|
"main": "./src/index.js"
|
||||||
}
|
}
|
||||||
|
|
130
src/constants.js
130
src/constants.js
|
@ -1,83 +1,79 @@
|
||||||
define(function(require) {
|
var O_READ = 'READ';
|
||||||
|
var O_WRITE = 'WRITE';
|
||||||
|
var O_CREATE = 'CREATE';
|
||||||
|
var O_EXCLUSIVE = 'EXCLUSIVE';
|
||||||
|
var O_TRUNCATE = 'TRUNCATE';
|
||||||
|
var O_APPEND = 'APPEND';
|
||||||
|
var XATTR_CREATE = 'CREATE';
|
||||||
|
var XATTR_REPLACE = 'REPLACE';
|
||||||
|
|
||||||
var O_READ = 'READ';
|
module.exports = {
|
||||||
var O_WRITE = 'WRITE';
|
FILE_SYSTEM_NAME: 'local',
|
||||||
var O_CREATE = 'CREATE';
|
|
||||||
var O_EXCLUSIVE = 'EXCLUSIVE';
|
|
||||||
var O_TRUNCATE = 'TRUNCATE';
|
|
||||||
var O_APPEND = 'APPEND';
|
|
||||||
var XATTR_CREATE = 'CREATE';
|
|
||||||
var XATTR_REPLACE = 'REPLACE';
|
|
||||||
|
|
||||||
return {
|
FILE_STORE_NAME: 'files',
|
||||||
FILE_SYSTEM_NAME: 'local',
|
|
||||||
|
|
||||||
FILE_STORE_NAME: 'files',
|
IDB_RO: 'readonly',
|
||||||
|
IDB_RW: 'readwrite',
|
||||||
|
|
||||||
IDB_RO: 'readonly',
|
WSQL_VERSION: "1",
|
||||||
IDB_RW: 'readwrite',
|
WSQL_SIZE: 5 * 1024 * 1024,
|
||||||
|
WSQL_DESC: "FileSystem Storage",
|
||||||
|
|
||||||
WSQL_VERSION: "1",
|
MODE_FILE: 'FILE',
|
||||||
WSQL_SIZE: 5 * 1024 * 1024,
|
MODE_DIRECTORY: 'DIRECTORY',
|
||||||
WSQL_DESC: "FileSystem Storage",
|
MODE_SYMBOLIC_LINK: 'SYMLINK',
|
||||||
|
MODE_META: 'META',
|
||||||
|
|
||||||
MODE_FILE: 'FILE',
|
SYMLOOP_MAX: 10,
|
||||||
MODE_DIRECTORY: 'DIRECTORY',
|
|
||||||
MODE_SYMBOLIC_LINK: 'SYMLINK',
|
|
||||||
MODE_META: 'META',
|
|
||||||
|
|
||||||
SYMLOOP_MAX: 10,
|
BINARY_MIME_TYPE: 'application/octet-stream',
|
||||||
|
JSON_MIME_TYPE: 'application/json',
|
||||||
|
|
||||||
BINARY_MIME_TYPE: 'application/octet-stream',
|
ROOT_DIRECTORY_NAME: '/', // basename(normalize(path))
|
||||||
JSON_MIME_TYPE: 'application/json',
|
|
||||||
|
|
||||||
ROOT_DIRECTORY_NAME: '/', // basename(normalize(path))
|
// FS Mount Flags
|
||||||
|
FS_FORMAT: 'FORMAT',
|
||||||
|
FS_NOCTIME: 'NOCTIME',
|
||||||
|
FS_NOMTIME: 'NOMTIME',
|
||||||
|
|
||||||
// FS Mount Flags
|
// FS File Open Flags
|
||||||
FS_FORMAT: 'FORMAT',
|
O_READ: O_READ,
|
||||||
FS_NOCTIME: 'NOCTIME',
|
O_WRITE: O_WRITE,
|
||||||
FS_NOMTIME: 'NOMTIME',
|
O_CREATE: O_CREATE,
|
||||||
|
O_EXCLUSIVE: O_EXCLUSIVE,
|
||||||
|
O_TRUNCATE: O_TRUNCATE,
|
||||||
|
O_APPEND: O_APPEND,
|
||||||
|
|
||||||
// FS File Open Flags
|
O_FLAGS: {
|
||||||
O_READ: O_READ,
|
'r': [O_READ],
|
||||||
O_WRITE: O_WRITE,
|
'r+': [O_READ, O_WRITE],
|
||||||
O_CREATE: O_CREATE,
|
'w': [O_WRITE, O_CREATE, O_TRUNCATE],
|
||||||
O_EXCLUSIVE: O_EXCLUSIVE,
|
'w+': [O_WRITE, O_READ, O_CREATE, O_TRUNCATE],
|
||||||
O_TRUNCATE: O_TRUNCATE,
|
'wx': [O_WRITE, O_CREATE, O_EXCLUSIVE, O_TRUNCATE],
|
||||||
O_APPEND: O_APPEND,
|
'wx+': [O_WRITE, O_READ, O_CREATE, O_EXCLUSIVE, O_TRUNCATE],
|
||||||
|
'a': [O_WRITE, O_CREATE, O_APPEND],
|
||||||
|
'a+': [O_WRITE, O_READ, O_CREATE, O_APPEND],
|
||||||
|
'ax': [O_WRITE, O_CREATE, O_EXCLUSIVE, O_APPEND],
|
||||||
|
'ax+': [O_WRITE, O_READ, O_CREATE, O_EXCLUSIVE, O_APPEND]
|
||||||
|
},
|
||||||
|
|
||||||
O_FLAGS: {
|
XATTR_CREATE: XATTR_CREATE,
|
||||||
'r': [O_READ],
|
XATTR_REPLACE: XATTR_REPLACE,
|
||||||
'r+': [O_READ, O_WRITE],
|
|
||||||
'w': [O_WRITE, O_CREATE, O_TRUNCATE],
|
|
||||||
'w+': [O_WRITE, O_READ, O_CREATE, O_TRUNCATE],
|
|
||||||
'wx': [O_WRITE, O_CREATE, O_EXCLUSIVE, O_TRUNCATE],
|
|
||||||
'wx+': [O_WRITE, O_READ, O_CREATE, O_EXCLUSIVE, O_TRUNCATE],
|
|
||||||
'a': [O_WRITE, O_CREATE, O_APPEND],
|
|
||||||
'a+': [O_WRITE, O_READ, O_CREATE, O_APPEND],
|
|
||||||
'ax': [O_WRITE, O_CREATE, O_EXCLUSIVE, O_APPEND],
|
|
||||||
'ax+': [O_WRITE, O_READ, O_CREATE, O_EXCLUSIVE, O_APPEND]
|
|
||||||
},
|
|
||||||
|
|
||||||
XATTR_CREATE: XATTR_CREATE,
|
FS_READY: 'READY',
|
||||||
XATTR_REPLACE: XATTR_REPLACE,
|
FS_PENDING: 'PENDING',
|
||||||
|
FS_ERROR: 'ERROR',
|
||||||
|
|
||||||
FS_READY: 'READY',
|
SUPER_NODE_ID: '00000000-0000-0000-0000-000000000000',
|
||||||
FS_PENDING: 'PENDING',
|
|
||||||
FS_ERROR: 'ERROR',
|
|
||||||
|
|
||||||
SUPER_NODE_ID: '00000000-0000-0000-0000-000000000000',
|
// Reserved File Descriptors for streams
|
||||||
|
STDIN: 0,
|
||||||
|
STDOUT: 1,
|
||||||
|
STDERR: 2,
|
||||||
|
FIRST_DESCRIPTOR: 3,
|
||||||
|
|
||||||
// Reserved File Descriptors for streams
|
ENVIRONMENT: {
|
||||||
STDIN: 0,
|
TMP: '/tmp',
|
||||||
STDOUT: 1,
|
PATH: ''
|
||||||
STDERR: 2,
|
}
|
||||||
FIRST_DESCRIPTOR: 3,
|
};
|
||||||
|
|
||||||
ENVIRONMENT: {
|
|
||||||
TMP: '/tmp',
|
|
||||||
PATH: ''
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
define(['src/constants'], function(Constants) {
|
var MODE_FILE = require('./constants.js').MODE_FILE;
|
||||||
|
|
||||||
return function DirectoryEntry(id, type) {
|
module.exports = function DirectoryEntry(id, type) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.type = type || Constants.MODE_FILE;
|
this.type = type || MODE_FILE;
|
||||||
};
|
};
|
||||||
|
|
||||||
});
|
|
||||||
|
|
178
src/errors.js
178
src/errors.js
|
@ -1,94 +1,92 @@
|
||||||
define(function(require) {
|
var errors = {};
|
||||||
var errors = {};
|
[
|
||||||
[
|
/**
|
||||||
/**
|
* node.js errors
|
||||||
* node.js errors
|
*/
|
||||||
*/
|
'-1:UNKNOWN:unknown error',
|
||||||
'-1:UNKNOWN:unknown error',
|
'0:OK:success',
|
||||||
'0:OK:success',
|
'1:EOF:end of file',
|
||||||
'1:EOF:end of file',
|
'2:EADDRINFO:getaddrinfo error',
|
||||||
'2:EADDRINFO:getaddrinfo error',
|
'3:EACCES:permission denied',
|
||||||
'3:EACCES:permission denied',
|
'4:EAGAIN:resource temporarily unavailable',
|
||||||
'4:EAGAIN:resource temporarily unavailable',
|
'5:EADDRINUSE:address already in use',
|
||||||
'5:EADDRINUSE:address already in use',
|
'6:EADDRNOTAVAIL:address not available',
|
||||||
'6:EADDRNOTAVAIL:address not available',
|
'7:EAFNOSUPPORT:address family not supported',
|
||||||
'7:EAFNOSUPPORT:address family not supported',
|
'8:EALREADY:connection already in progress',
|
||||||
'8:EALREADY:connection already in progress',
|
'9:EBADF:bad file descriptor',
|
||||||
'9:EBADF:bad file descriptor',
|
'10:EBUSY:resource busy or locked',
|
||||||
'10:EBUSY:resource busy or locked',
|
'11:ECONNABORTED:software caused connection abort',
|
||||||
'11:ECONNABORTED:software caused connection abort',
|
'12:ECONNREFUSED:connection refused',
|
||||||
'12:ECONNREFUSED:connection refused',
|
'13:ECONNRESET:connection reset by peer',
|
||||||
'13:ECONNRESET:connection reset by peer',
|
'14:EDESTADDRREQ:destination address required',
|
||||||
'14:EDESTADDRREQ:destination address required',
|
'15:EFAULT:bad address in system call argument',
|
||||||
'15:EFAULT:bad address in system call argument',
|
'16:EHOSTUNREACH:host is unreachable',
|
||||||
'16:EHOSTUNREACH:host is unreachable',
|
'17:EINTR:interrupted system call',
|
||||||
'17:EINTR:interrupted system call',
|
'18:EINVAL:invalid argument',
|
||||||
'18:EINVAL:invalid argument',
|
'19:EISCONN:socket is already connected',
|
||||||
'19:EISCONN:socket is already connected',
|
'20:EMFILE:too many open files',
|
||||||
'20:EMFILE:too many open files',
|
'21:EMSGSIZE:message too long',
|
||||||
'21:EMSGSIZE:message too long',
|
'22:ENETDOWN:network is down',
|
||||||
'22:ENETDOWN:network is down',
|
'23:ENETUNREACH:network is unreachable',
|
||||||
'23:ENETUNREACH:network is unreachable',
|
'24:ENFILE:file table overflow',
|
||||||
'24:ENFILE:file table overflow',
|
'25:ENOBUFS:no buffer space available',
|
||||||
'25:ENOBUFS:no buffer space available',
|
'26:ENOMEM:not enough memory',
|
||||||
'26:ENOMEM:not enough memory',
|
'27:ENOTDIR:not a directory',
|
||||||
'27:ENOTDIR:not a directory',
|
'28:EISDIR:illegal operation on a directory',
|
||||||
'28:EISDIR:illegal operation on a directory',
|
'29:ENONET:machine is not on the network',
|
||||||
'29:ENONET:machine is not on the network',
|
// errno 30 skipped, as per https://github.com/rvagg/node-errno/blob/master/errno.js
|
||||||
// errno 30 skipped, as per https://github.com/rvagg/node-errno/blob/master/errno.js
|
'31:ENOTCONN:socket is not connected',
|
||||||
'31:ENOTCONN:socket is not connected',
|
'32:ENOTSOCK:socket operation on non-socket',
|
||||||
'32:ENOTSOCK:socket operation on non-socket',
|
'33:ENOTSUP:operation not supported on socket',
|
||||||
'33:ENOTSUP:operation not supported on socket',
|
'34:ENOENT:no such file or directory',
|
||||||
'34:ENOENT:no such file or directory',
|
'35:ENOSYS:function not implemented',
|
||||||
'35:ENOSYS:function not implemented',
|
'36:EPIPE:broken pipe',
|
||||||
'36:EPIPE:broken pipe',
|
'37:EPROTO:protocol error',
|
||||||
'37:EPROTO:protocol error',
|
'38:EPROTONOSUPPORT:protocol not supported',
|
||||||
'38:EPROTONOSUPPORT:protocol not supported',
|
'39:EPROTOTYPE:protocol wrong type for socket',
|
||||||
'39:EPROTOTYPE:protocol wrong type for socket',
|
'40:ETIMEDOUT:connection timed out',
|
||||||
'40:ETIMEDOUT:connection timed out',
|
'41:ECHARSET:invalid Unicode character',
|
||||||
'41:ECHARSET:invalid Unicode character',
|
'42:EAIFAMNOSUPPORT:address family for hostname not supported',
|
||||||
'42:EAIFAMNOSUPPORT:address family for hostname not supported',
|
// errno 43 skipped, as per https://github.com/rvagg/node-errno/blob/master/errno.js
|
||||||
// errno 43 skipped, as per https://github.com/rvagg/node-errno/blob/master/errno.js
|
'44:EAISERVICE:servname not supported for ai_socktype',
|
||||||
'44:EAISERVICE:servname not supported for ai_socktype',
|
'45:EAISOCKTYPE:ai_socktype not supported',
|
||||||
'45:EAISOCKTYPE:ai_socktype not supported',
|
'46:ESHUTDOWN:cannot send after transport endpoint shutdown',
|
||||||
'46:ESHUTDOWN:cannot send after transport endpoint shutdown',
|
'47:EEXIST:file already exists',
|
||||||
'47:EEXIST:file already exists',
|
'48:ESRCH:no such process',
|
||||||
'48:ESRCH:no such process',
|
'49:ENAMETOOLONG:name too long',
|
||||||
'49:ENAMETOOLONG:name too long',
|
'50:EPERM:operation not permitted',
|
||||||
'50:EPERM:operation not permitted',
|
'51:ELOOP:too many symbolic links encountered',
|
||||||
'51:ELOOP:too many symbolic links encountered',
|
'52:EXDEV:cross-device link not permitted',
|
||||||
'52:EXDEV:cross-device link not permitted',
|
'53:ENOTEMPTY:directory not empty',
|
||||||
'53:ENOTEMPTY:directory not empty',
|
'54:ENOSPC:no space left on device',
|
||||||
'54:ENOSPC:no space left on device',
|
'55:EIO:i/o error',
|
||||||
'55:EIO:i/o error',
|
'56:EROFS:read-only file system',
|
||||||
'56:EROFS:read-only file system',
|
'57:ENODEV:no such device',
|
||||||
'57:ENODEV:no such device',
|
'58:ESPIPE:invalid seek',
|
||||||
'58:ESPIPE:invalid seek',
|
'59:ECANCELED:operation canceled',
|
||||||
'59:ECANCELED:operation canceled',
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Filer specific errors
|
* Filer specific errors
|
||||||
*/
|
*/
|
||||||
'1000:ENOTMOUNTED:not mounted',
|
'1000:ENOTMOUNTED:not mounted',
|
||||||
'1001:EFILESYSTEMERROR:missing super node, use \'FORMAT\' flag to format filesystem.',
|
'1001:EFILESYSTEMERROR:missing super node, use \'FORMAT\' flag to format filesystem.',
|
||||||
'1002:ENOATTR:attribute does not exist'
|
'1002:ENOATTR:attribute does not exist'
|
||||||
].forEach(function(e) {
|
].forEach(function(e) {
|
||||||
e = e.split(':');
|
e = e.split(':');
|
||||||
var errno = e[0],
|
var errno = e[0],
|
||||||
err = e[1],
|
err = e[1],
|
||||||
message = e[2];
|
message = e[2];
|
||||||
|
|
||||||
function ctor(m) {
|
function ctor(m) {
|
||||||
this.message = m || message;
|
this.message = m || message;
|
||||||
}
|
}
|
||||||
var proto = ctor.prototype = new Error();
|
var proto = ctor.prototype = new Error();
|
||||||
proto.errno = errno;
|
proto.errno = errno;
|
||||||
proto.code = err;
|
proto.code = err;
|
||||||
proto.constructor = ctor;
|
proto.constructor = ctor;
|
||||||
|
|
||||||
// We expose the error as both Errors.EINVAL and Errors[18]
|
// We expose the error as both Errors.EINVAL and Errors[18]
|
||||||
errors[err] = errors[errno] = ctor;
|
errors[err] = errors[errno] = ctor;
|
||||||
});
|
|
||||||
|
|
||||||
return errors;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
module.exports = errors;
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,302 +1,302 @@
|
||||||
define(function(require) {
|
var _ = require('../../lib/nodash.js');
|
||||||
|
|
||||||
var _ = require('nodash');
|
var isNullPath = require('../path.js').isNull;
|
||||||
|
var nop = require('../shared.js').nop;
|
||||||
|
|
||||||
var isNullPath = require('src/path').isNull;
|
var Constants = require('../constants.js');
|
||||||
var nop = require('src/shared').nop;
|
var FILE_SYSTEM_NAME = Constants.FILE_SYSTEM_NAME;
|
||||||
|
var FS_FORMAT = Constants.FS_FORMAT;
|
||||||
|
var FS_READY = Constants.FS_READY;
|
||||||
|
var FS_PENDING = Constants.FS_PENDING;
|
||||||
|
var FS_ERROR = Constants.FS_ERROR;
|
||||||
|
|
||||||
var FILE_SYSTEM_NAME = require('src/constants').FILE_SYSTEM_NAME;
|
// TODO: fix adapters + providers for node.js...
|
||||||
var FS_FORMAT = require('src/constants').FS_FORMAT;
|
//var providers = require('../providers/providers.js');
|
||||||
var FS_READY = require('src/constants').FS_READY;
|
var providers = {};
|
||||||
var FS_PENDING = require('src/constants').FS_PENDING;
|
//var adapters = require('../adapters/adapters.js');
|
||||||
var FS_ERROR = require('src/constants').FS_ERROR;
|
var adapters = {};
|
||||||
|
|
||||||
var providers = require('src/providers/providers');
|
var Shell = require('../shell/shell.js');
|
||||||
var adapters = require('src/adapters/adapters');
|
var Intercom = require('../../lib/intercom.js');
|
||||||
|
var FSWatcher = require('../fs-watcher.js');
|
||||||
|
var Errors = require('../errors.js');
|
||||||
|
|
||||||
var Shell = require('src/shell/shell');
|
var STDIN = Constants.STDIN;
|
||||||
var Intercom = require('intercom');
|
var STDOUT = Constants.STDOUT;
|
||||||
var FSWatcher = require('src/fs-watcher');
|
var STDERR = Constants.STDERR;
|
||||||
var Errors = require('src/errors');
|
var FIRST_DESCRIPTOR = Constants.FIRST_DESCRIPTOR;
|
||||||
|
|
||||||
var STDIN = require('src/constants').STDIN;
|
|
||||||
var STDOUT = require('src/constants').STDOUT;
|
|
||||||
var STDERR = require('src/constants').STDERR;
|
|
||||||
var FIRST_DESCRIPTOR = require('src/constants').FIRST_DESCRIPTOR;
|
|
||||||
|
|
||||||
// The core fs operations live on impl
|
// The core fs operations live on impl
|
||||||
var impl = require('src/filesystem/implementation');
|
var impl = require('./implementation.js');
|
||||||
|
|
||||||
// node.js supports a calling pattern that leaves off a callback.
|
// node.js supports a calling pattern that leaves off a callback.
|
||||||
function maybeCallback(callback) {
|
function maybeCallback(callback) {
|
||||||
if(typeof callback === "function") {
|
if(typeof callback === "function") {
|
||||||
return callback;
|
return callback;
|
||||||
}
|
|
||||||
return function(err) {
|
|
||||||
if(err) {
|
|
||||||
throw err;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
return function(err) {
|
||||||
|
if(err) {
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* FileSystem
|
* FileSystem
|
||||||
*
|
*
|
||||||
* A FileSystem takes an `options` object, which can specify a number of,
|
* A FileSystem takes an `options` object, which can specify a number of,
|
||||||
* options. All options are optional, and include:
|
* options. All options are optional, and include:
|
||||||
*
|
*
|
||||||
* name: the name of the file system, defaults to "local"
|
* name: the name of the file system, defaults to "local"
|
||||||
*
|
*
|
||||||
* flags: one or more flags to use when creating/opening the file system.
|
* flags: one or more flags to use when creating/opening the file system.
|
||||||
* For example: "FORMAT" will cause the file system to be formatted.
|
* For example: "FORMAT" will cause the file system to be formatted.
|
||||||
* No explicit flags are set by default.
|
* No explicit flags are set by default.
|
||||||
*
|
*
|
||||||
* provider: an explicit storage provider to use for the file
|
* provider: an explicit storage provider to use for the file
|
||||||
* system's database context provider. A number of context
|
* system's database context provider. A number of context
|
||||||
* providers are included (see /src/providers), and users
|
* providers are included (see /src/providers), and users
|
||||||
* can write one of their own and pass it in to be used.
|
* can write one of their own and pass it in to be used.
|
||||||
* By default an IndexedDB provider is used.
|
* By default an IndexedDB provider is used.
|
||||||
*
|
*
|
||||||
* callback: a callback function to be executed when the file system becomes
|
* callback: a callback function to be executed when the file system becomes
|
||||||
* ready for use. Depending on the context provider used, this might
|
* ready for use. Depending on the context provider used, this might
|
||||||
* be right away, or could take some time. The callback should expect
|
* be right away, or could take some time. The callback should expect
|
||||||
* an `error` argument, which will be null if everything worked. Also
|
* an `error` argument, which will be null if everything worked. Also
|
||||||
* users should check the file system's `readyState` and `error`
|
* users should check the file system's `readyState` and `error`
|
||||||
* properties to make sure it is usable.
|
* properties to make sure it is usable.
|
||||||
*/
|
*/
|
||||||
function FileSystem(options, callback) {
|
function FileSystem(options, callback) {
|
||||||
options = options || {};
|
options = options || {};
|
||||||
callback = callback || nop;
|
callback = callback || nop;
|
||||||
|
|
||||||
var flags = options.flags;
|
var flags = options.flags;
|
||||||
var provider = options.provider || new providers.Default(options.name || FILE_SYSTEM_NAME);
|
var provider = options.provider || new providers.Default(options.name || FILE_SYSTEM_NAME);
|
||||||
// If we're given a provider, match its name unless we get an explicit name
|
// If we're given a provider, match its name unless we get an explicit name
|
||||||
var name = options.name || provider.name;
|
var name = options.name || provider.name;
|
||||||
var forceFormatting = _(flags).contains(FS_FORMAT);
|
var forceFormatting = _(flags).contains(FS_FORMAT);
|
||||||
|
|
||||||
var fs = this;
|
var fs = this;
|
||||||
fs.readyState = FS_PENDING;
|
fs.readyState = FS_PENDING;
|
||||||
fs.name = name;
|
fs.name = name;
|
||||||
fs.error = null;
|
fs.error = null;
|
||||||
|
|
||||||
fs.stdin = STDIN;
|
fs.stdin = STDIN;
|
||||||
fs.stdout = STDOUT;
|
fs.stdout = STDOUT;
|
||||||
fs.stderr = STDERR;
|
fs.stderr = STDERR;
|
||||||
|
|
||||||
// Safely expose the list of open files and file
|
// Safely expose the list of open files and file
|
||||||
// descriptor management functions
|
// descriptor management functions
|
||||||
var openFiles = {};
|
var openFiles = {};
|
||||||
var nextDescriptor = FIRST_DESCRIPTOR;
|
var nextDescriptor = FIRST_DESCRIPTOR;
|
||||||
Object.defineProperty(this, "openFiles", {
|
Object.defineProperty(this, "openFiles", {
|
||||||
get: function() { return openFiles; }
|
get: function() { return openFiles; }
|
||||||
});
|
});
|
||||||
this.allocDescriptor = function(openFileDescription) {
|
this.allocDescriptor = function(openFileDescription) {
|
||||||
var fd = nextDescriptor ++;
|
var fd = nextDescriptor ++;
|
||||||
openFiles[fd] = openFileDescription;
|
openFiles[fd] = openFileDescription;
|
||||||
return fd;
|
return fd;
|
||||||
};
|
};
|
||||||
this.releaseDescriptor = function(fd) {
|
this.releaseDescriptor = function(fd) {
|
||||||
delete openFiles[fd];
|
delete openFiles[fd];
|
||||||
};
|
};
|
||||||
|
|
||||||
// Safely expose the operation queue
|
// Safely expose the operation queue
|
||||||
var queue = [];
|
var queue = [];
|
||||||
this.queueOrRun = function(operation) {
|
this.queueOrRun = function(operation) {
|
||||||
var error;
|
var error;
|
||||||
|
|
||||||
if(FS_READY == fs.readyState) {
|
if(FS_READY == fs.readyState) {
|
||||||
operation.call(fs);
|
operation.call(fs);
|
||||||
} else if(FS_ERROR == fs.readyState) {
|
} else if(FS_ERROR == fs.readyState) {
|
||||||
error = new Errors.EFILESYSTEMERROR('unknown error');
|
error = new Errors.EFILESYSTEMERROR('unknown error');
|
||||||
} else {
|
} else {
|
||||||
queue.push(operation);
|
queue.push(operation);
|
||||||
}
|
|
||||||
|
|
||||||
return error;
|
|
||||||
};
|
|
||||||
function runQueued() {
|
|
||||||
queue.forEach(function(operation) {
|
|
||||||
operation.call(this);
|
|
||||||
}.bind(fs));
|
|
||||||
queue = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// We support the optional `options` arg from node, but ignore it
|
return error;
|
||||||
this.watch = function(filename, options, listener) {
|
};
|
||||||
if(isNullPath(filename)) {
|
function runQueued() {
|
||||||
throw new Error('Path must be a string without null bytes.');
|
queue.forEach(function(operation) {
|
||||||
}
|
operation.call(this);
|
||||||
if(typeof options === 'function') {
|
}.bind(fs));
|
||||||
listener = options;
|
queue = null;
|
||||||
options = {};
|
}
|
||||||
}
|
|
||||||
options = options || {};
|
|
||||||
listener = listener || nop;
|
|
||||||
|
|
||||||
var watcher = new FSWatcher();
|
// We support the optional `options` arg from node, but ignore it
|
||||||
watcher.start(filename, false, options.recursive);
|
this.watch = function(filename, options, listener) {
|
||||||
watcher.on('change', listener);
|
if(isNullPath(filename)) {
|
||||||
|
throw new Error('Path must be a string without null bytes.');
|
||||||
return watcher;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Let other instances (in this or other windows) know about
|
|
||||||
// any changes to this fs instance.
|
|
||||||
function broadcastChanges(changes) {
|
|
||||||
if(!changes.length) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var intercom = Intercom.getInstance();
|
|
||||||
changes.forEach(function(change) {
|
|
||||||
intercom.emit(change.event, change.path);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
if(typeof options === 'function') {
|
||||||
|
listener = options;
|
||||||
|
options = {};
|
||||||
|
}
|
||||||
|
options = options || {};
|
||||||
|
listener = listener || nop;
|
||||||
|
|
||||||
// Open file system storage provider
|
var watcher = new FSWatcher();
|
||||||
provider.open(function(err, needsFormatting) {
|
watcher.start(filename, false, options.recursive);
|
||||||
function complete(error) {
|
watcher.on('change', listener);
|
||||||
|
|
||||||
function wrappedContext(methodName) {
|
return watcher;
|
||||||
var context = provider[methodName]();
|
};
|
||||||
context.flags = flags;
|
|
||||||
context.changes = [];
|
|
||||||
|
|
||||||
// When the context is finished, let the fs deal with any change events
|
// Let other instances (in this or other windows) know about
|
||||||
context.close = function() {
|
// any changes to this fs instance.
|
||||||
var changes = context.changes;
|
function broadcastChanges(changes) {
|
||||||
broadcastChanges(changes);
|
if(!changes.length) {
|
||||||
changes.length = 0;
|
return;
|
||||||
};
|
}
|
||||||
|
var intercom = Intercom.getInstance();
|
||||||
return context;
|
changes.forEach(function(change) {
|
||||||
}
|
intercom.emit(change.event, change.path);
|
||||||
|
|
||||||
// Wrap the provider so we can extend the context with fs flags and
|
|
||||||
// an array of changes (e.g., watch event 'change' and 'rename' events
|
|
||||||
// for paths updated during the lifetime of the context). From this
|
|
||||||
// point forward we won't call open again, so it's safe to drop it.
|
|
||||||
fs.provider = {
|
|
||||||
openReadWriteContext: function() {
|
|
||||||
return wrappedContext('getReadWriteContext');
|
|
||||||
},
|
|
||||||
openReadOnlyContext: function() {
|
|
||||||
return wrappedContext('getReadOnlyContext');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if(error) {
|
|
||||||
fs.readyState = FS_ERROR;
|
|
||||||
} else {
|
|
||||||
fs.readyState = FS_READY;
|
|
||||||
runQueued();
|
|
||||||
}
|
|
||||||
callback(error, fs);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(err) {
|
|
||||||
return complete(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we don't need or want formatting, we're done
|
|
||||||
if(!(forceFormatting || needsFormatting)) {
|
|
||||||
return complete(null);
|
|
||||||
}
|
|
||||||
// otherwise format the fs first
|
|
||||||
var context = provider.getReadWriteContext();
|
|
||||||
context.clear(function(err) {
|
|
||||||
if(err) {
|
|
||||||
complete(err);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
impl.makeRootDirectory(context, complete);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Expose storage providers on FileSystem constructor
|
// Open file system storage provider
|
||||||
FileSystem.providers = providers;
|
provider.open(function(err, needsFormatting) {
|
||||||
|
function complete(error) {
|
||||||
|
|
||||||
// Expose adatpers on FileSystem constructor
|
function wrappedContext(methodName) {
|
||||||
FileSystem.adapters = adapters;
|
var context = provider[methodName]();
|
||||||
|
context.flags = flags;
|
||||||
|
context.changes = [];
|
||||||
|
|
||||||
/**
|
// When the context is finished, let the fs deal with any change events
|
||||||
* Public API for FileSystem
|
context.close = function() {
|
||||||
*/
|
var changes = context.changes;
|
||||||
[
|
broadcastChanges(changes);
|
||||||
'open',
|
changes.length = 0;
|
||||||
'close',
|
};
|
||||||
'mknod',
|
|
||||||
'mkdir',
|
|
||||||
'rmdir',
|
|
||||||
'stat',
|
|
||||||
'fstat',
|
|
||||||
'link',
|
|
||||||
'unlink',
|
|
||||||
'read',
|
|
||||||
'readFile',
|
|
||||||
'write',
|
|
||||||
'writeFile',
|
|
||||||
'appendFile',
|
|
||||||
'exists',
|
|
||||||
'lseek',
|
|
||||||
'readdir',
|
|
||||||
'rename',
|
|
||||||
'readlink',
|
|
||||||
'symlink',
|
|
||||||
'lstat',
|
|
||||||
'truncate',
|
|
||||||
'ftruncate',
|
|
||||||
'utimes',
|
|
||||||
'futimes',
|
|
||||||
'setxattr',
|
|
||||||
'getxattr',
|
|
||||||
'fsetxattr',
|
|
||||||
'fgetxattr',
|
|
||||||
'removexattr',
|
|
||||||
'fremovexattr'
|
|
||||||
].forEach(function(methodName) {
|
|
||||||
FileSystem.prototype[methodName] = function() {
|
|
||||||
var fs = this;
|
|
||||||
var args = Array.prototype.slice.call(arguments, 0);
|
|
||||||
var lastArgIndex = args.length - 1;
|
|
||||||
|
|
||||||
// We may or may not get a callback, and since node.js supports
|
return context;
|
||||||
// fire-and-forget style fs operations, we have to dance a bit here.
|
|
||||||
var missingCallback = typeof args[lastArgIndex] !== 'function';
|
|
||||||
var callback = maybeCallback(args[lastArgIndex]);
|
|
||||||
|
|
||||||
var error = fs.queueOrRun(function() {
|
|
||||||
var context = fs.provider.openReadWriteContext();
|
|
||||||
|
|
||||||
// Wrap the callback so we can explicitly close the context
|
|
||||||
function complete() {
|
|
||||||
context.close();
|
|
||||||
callback.apply(fs, arguments);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Either add or replace the callback with our wrapper complete()
|
|
||||||
if(missingCallback) {
|
|
||||||
args.push(complete);
|
|
||||||
} else {
|
|
||||||
args[lastArgIndex] = complete;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Forward this call to the impl's version, using the following
|
|
||||||
// call signature, with complete() as the callback/last-arg now:
|
|
||||||
// fn(fs, context, arg0, arg1, ... , complete);
|
|
||||||
var fnArgs = [fs, context].concat(args);
|
|
||||||
impl[methodName].apply(null, fnArgs);
|
|
||||||
});
|
|
||||||
if(error) {
|
|
||||||
callback(error);
|
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
// Wrap the provider so we can extend the context with fs flags and
|
||||||
|
// an array of changes (e.g., watch event 'change' and 'rename' events
|
||||||
|
// for paths updated during the lifetime of the context). From this
|
||||||
|
// point forward we won't call open again, so it's safe to drop it.
|
||||||
|
fs.provider = {
|
||||||
|
openReadWriteContext: function() {
|
||||||
|
return wrappedContext('getReadWriteContext');
|
||||||
|
},
|
||||||
|
openReadOnlyContext: function() {
|
||||||
|
return wrappedContext('getReadOnlyContext');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if(error) {
|
||||||
|
fs.readyState = FS_ERROR;
|
||||||
|
} else {
|
||||||
|
fs.readyState = FS_READY;
|
||||||
|
runQueued();
|
||||||
|
}
|
||||||
|
callback(error, fs);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(err) {
|
||||||
|
return complete(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we don't need or want formatting, we're done
|
||||||
|
if(!(forceFormatting || needsFormatting)) {
|
||||||
|
return complete(null);
|
||||||
|
}
|
||||||
|
// otherwise format the fs first
|
||||||
|
var context = provider.getReadWriteContext();
|
||||||
|
context.clear(function(err) {
|
||||||
|
if(err) {
|
||||||
|
complete(err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
impl.makeRootDirectory(context, complete);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
FileSystem.prototype.Shell = function(options) {
|
// Expose storage providers on FileSystem constructor
|
||||||
return new Shell(this, options);
|
FileSystem.providers = providers;
|
||||||
|
|
||||||
|
// Expose adatpers on FileSystem constructor
|
||||||
|
FileSystem.adapters = adapters;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Public API for FileSystem
|
||||||
|
*/
|
||||||
|
[
|
||||||
|
'open',
|
||||||
|
'close',
|
||||||
|
'mknod',
|
||||||
|
'mkdir',
|
||||||
|
'rmdir',
|
||||||
|
'stat',
|
||||||
|
'fstat',
|
||||||
|
'link',
|
||||||
|
'unlink',
|
||||||
|
'read',
|
||||||
|
'readFile',
|
||||||
|
'write',
|
||||||
|
'writeFile',
|
||||||
|
'appendFile',
|
||||||
|
'exists',
|
||||||
|
'lseek',
|
||||||
|
'readdir',
|
||||||
|
'rename',
|
||||||
|
'readlink',
|
||||||
|
'symlink',
|
||||||
|
'lstat',
|
||||||
|
'truncate',
|
||||||
|
'ftruncate',
|
||||||
|
'utimes',
|
||||||
|
'futimes',
|
||||||
|
'setxattr',
|
||||||
|
'getxattr',
|
||||||
|
'fsetxattr',
|
||||||
|
'fgetxattr',
|
||||||
|
'removexattr',
|
||||||
|
'fremovexattr'
|
||||||
|
].forEach(function(methodName) {
|
||||||
|
FileSystem.prototype[methodName] = function() {
|
||||||
|
var fs = this;
|
||||||
|
var args = Array.prototype.slice.call(arguments, 0);
|
||||||
|
var lastArgIndex = args.length - 1;
|
||||||
|
|
||||||
|
// We may or may not get a callback, and since node.js supports
|
||||||
|
// fire-and-forget style fs operations, we have to dance a bit here.
|
||||||
|
var missingCallback = typeof args[lastArgIndex] !== 'function';
|
||||||
|
var callback = maybeCallback(args[lastArgIndex]);
|
||||||
|
|
||||||
|
var error = fs.queueOrRun(function() {
|
||||||
|
var context = fs.provider.openReadWriteContext();
|
||||||
|
|
||||||
|
// Wrap the callback so we can explicitly close the context
|
||||||
|
function complete() {
|
||||||
|
context.close();
|
||||||
|
callback.apply(fs, arguments);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Either add or replace the callback with our wrapper complete()
|
||||||
|
if(missingCallback) {
|
||||||
|
args.push(complete);
|
||||||
|
} else {
|
||||||
|
args[lastArgIndex] = complete;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Forward this call to the impl's version, using the following
|
||||||
|
// call signature, with complete() as the callback/last-arg now:
|
||||||
|
// fn(fs, context, arg0, arg1, ... , complete);
|
||||||
|
var fnArgs = [fs, context].concat(args);
|
||||||
|
impl[methodName].apply(null, fnArgs);
|
||||||
|
});
|
||||||
|
if(error) {
|
||||||
|
callback(error);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
return FileSystem;
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
FileSystem.prototype.Shell = function(options) {
|
||||||
|
return new Shell(this, options);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = FileSystem;
|
||||||
|
|
|
@ -1,54 +1,51 @@
|
||||||
define(function(require) {
|
var EventEmitter = require('../lib/eventemitter.js');
|
||||||
|
var isNullPath = require('./path.js').isNull;
|
||||||
|
var Intercom = require('../lib/intercom.js');
|
||||||
|
|
||||||
var EventEmitter = require('eventemitter');
|
/**
|
||||||
var isNullPath = require('src/path').isNull;
|
* FSWatcher based on node.js' FSWatcher
|
||||||
var Intercom = require('intercom');
|
* see https://github.com/joyent/node/blob/master/lib/fs.js
|
||||||
|
*/
|
||||||
|
function FSWatcher() {
|
||||||
|
EventEmitter.call(this);
|
||||||
|
var self = this;
|
||||||
|
var recursive = false;
|
||||||
|
var filename;
|
||||||
|
|
||||||
/**
|
function onchange(path) {
|
||||||
* FSWatcher based on node.js' FSWatcher
|
// Watch for exact filename, or parent path when recursive is true
|
||||||
* see https://github.com/joyent/node/blob/master/lib/fs.js
|
if(filename === path || (recursive && path.indexOf(filename + '/') === 0)) {
|
||||||
*/
|
self.trigger('change', 'change', path);
|
||||||
function FSWatcher() {
|
}
|
||||||
EventEmitter.call(this);
|
}
|
||||||
var self = this;
|
|
||||||
var recursive = false;
|
|
||||||
var filename;
|
|
||||||
|
|
||||||
function onchange(path) {
|
// We support, but ignore the second arg, which node.js uses.
|
||||||
// Watch for exact filename, or parent path when recursive is true
|
self.start = function(filename_, persistent_, recursive_) {
|
||||||
if(filename === path || (recursive && path.indexOf(filename + '/') === 0)) {
|
// Bail if we've already started (and therefore have a filename);
|
||||||
self.trigger('change', 'change', path);
|
if(filename) {
|
||||||
}
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// We support, but ignore the second arg, which node.js uses.
|
if(isNullPath(filename_)) {
|
||||||
self.start = function(filename_, persistent_, recursive_) {
|
throw new Error('Path must be a string without null bytes.');
|
||||||
// Bail if we've already started (and therefore have a filename);
|
}
|
||||||
if(filename) {
|
// TODO: get realpath for symlinks on filename...
|
||||||
return;
|
filename = filename_;
|
||||||
}
|
|
||||||
|
|
||||||
if(isNullPath(filename_)) {
|
// Whether to watch beneath this path or not
|
||||||
throw new Error('Path must be a string without null bytes.');
|
recursive = recursive_ === true;
|
||||||
}
|
|
||||||
// TODO: get realpath for symlinks on filename...
|
|
||||||
filename = filename_;
|
|
||||||
|
|
||||||
// Whether to watch beneath this path or not
|
var intercom = Intercom.getInstance();
|
||||||
recursive = recursive_ === true;
|
intercom.on('change', onchange);
|
||||||
|
};
|
||||||
|
|
||||||
var intercom = Intercom.getInstance();
|
self.close = function() {
|
||||||
intercom.on('change', onchange);
|
var intercom = Intercom.getInstance();
|
||||||
};
|
intercom.off('change', onchange);
|
||||||
|
self.removeAllListeners('change');
|
||||||
|
};
|
||||||
|
}
|
||||||
|
FSWatcher.prototype = new EventEmitter();
|
||||||
|
FSWatcher.prototype.constructor = FSWatcher;
|
||||||
|
|
||||||
self.close = function() {
|
module.exports = FSWatcher;
|
||||||
var intercom = Intercom.getInstance();
|
|
||||||
intercom.off('change', onchange);
|
|
||||||
self.removeAllListeners('change');
|
|
||||||
};
|
|
||||||
}
|
|
||||||
FSWatcher.prototype = new EventEmitter();
|
|
||||||
FSWatcher.prototype.constructor = FSWatcher;
|
|
||||||
|
|
||||||
return FSWatcher;
|
|
||||||
});
|
|
||||||
|
|
12
src/index.js
12
src/index.js
|
@ -1,7 +1,5 @@
|
||||||
define(function(require) {
|
module.exports = {
|
||||||
return {
|
FileSystem: require('./filesystem/interface.js'),
|
||||||
FileSystem: require('src/filesystem/interface'),
|
Path: require('./path.js'),
|
||||||
Path: require('src/path'),
|
Errors: require('./errors.js')
|
||||||
Errors: require('src/errors')
|
};
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
133
src/network.js
133
src/network.js
|
@ -1,82 +1,55 @@
|
||||||
define(function(require) {
|
function browserDownload(uri, callback) {
|
||||||
// Pull in node's request module if possible/needed
|
var query = new XMLHttpRequest();
|
||||||
if (typeof XMLHttpRequest === 'undefined') {
|
query.onload = function() {
|
||||||
// This is a stupid workaround for the fact that
|
var err = query.status != 200 ? { message: query.statusText, code: query.status } : null,
|
||||||
// the r.js optimizer checks every require() call
|
data = err ? null : new Uint8Array(query.response);
|
||||||
// during optimization and throws an error if it
|
|
||||||
// can't find the module.
|
|
||||||
//
|
|
||||||
// This is only an issue with our browser build
|
|
||||||
// using `almond` (https://github.com/jrburke/almond)
|
|
||||||
// which doesn't fallback to node's require when we
|
|
||||||
// need it to.
|
|
||||||
var node_req = require;
|
|
||||||
var request = node_req('request');
|
|
||||||
}
|
|
||||||
|
|
||||||
function browserDownload(uri, callback) {
|
callback(err, data);
|
||||||
var query = new XMLHttpRequest();
|
|
||||||
query.onload = function() {
|
|
||||||
var err = query.status != 200 ? { message: query.statusText, code: query.status } : null,
|
|
||||||
data = err ? null : new Uint8Array(query.response);
|
|
||||||
|
|
||||||
callback(err, data);
|
|
||||||
};
|
|
||||||
query.open("GET", uri);
|
|
||||||
if("withCredentials" in query) {
|
|
||||||
query.withCredentials = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
query.responseType = "arraybuffer";
|
|
||||||
query.send();
|
|
||||||
}
|
|
||||||
|
|
||||||
function nodeDownload(uri, callback) {
|
|
||||||
request({
|
|
||||||
url: uri,
|
|
||||||
method: "GET",
|
|
||||||
encoding: null
|
|
||||||
}, function(err, msg, body) {
|
|
||||||
var data = null,
|
|
||||||
arrayBuffer,
|
|
||||||
statusCode,
|
|
||||||
arrayLength = body && body.length,
|
|
||||||
error;
|
|
||||||
|
|
||||||
msg = msg || null;
|
|
||||||
statusCode = msg && msg.statusCode;
|
|
||||||
|
|
||||||
error = statusCode != 200 ? { message: err || 'Not found!', code: statusCode } : null;
|
|
||||||
|
|
||||||
arrayBuffer = arrayLength && new ArrayBuffer(arrayLength);
|
|
||||||
|
|
||||||
// Convert buffer to Uint8Array
|
|
||||||
if (arrayBuffer && (statusCode == 200)) {
|
|
||||||
data = new Uint8Array(arrayBuffer);
|
|
||||||
for (var i = 0; i < body.length; ++i) {
|
|
||||||
data[i] = body[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
callback(error, data);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
download: function(uri, callback) {
|
|
||||||
if (!uri) {
|
|
||||||
throw('Uri required!');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!callback) {
|
|
||||||
throw('Callback required');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof XMLHttpRequest === "undefined") {
|
|
||||||
nodeDownload(uri, callback);
|
|
||||||
} else {
|
|
||||||
browserDownload(uri, callback);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
});
|
query.open("GET", uri);
|
||||||
|
if("withCredentials" in query) {
|
||||||
|
query.withCredentials = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
query.responseType = "arraybuffer";
|
||||||
|
query.send();
|
||||||
|
}
|
||||||
|
|
||||||
|
function nodeDownload(uri, callback) {
|
||||||
|
require('request')({
|
||||||
|
url: uri,
|
||||||
|
method: "GET",
|
||||||
|
encoding: null
|
||||||
|
}, function(err, msg, body) {
|
||||||
|
var data = null,
|
||||||
|
arrayBuffer,
|
||||||
|
statusCode,
|
||||||
|
arrayLength = body && body.length,
|
||||||
|
error;
|
||||||
|
|
||||||
|
msg = msg || null;
|
||||||
|
statusCode = msg && msg.statusCode;
|
||||||
|
|
||||||
|
error = statusCode != 200 ? { message: err || 'Not found!', code: statusCode } : null;
|
||||||
|
|
||||||
|
arrayBuffer = arrayLength && new ArrayBuffer(arrayLength);
|
||||||
|
|
||||||
|
// Convert buffer to Uint8Array
|
||||||
|
if (arrayBuffer && (statusCode == 200)) {
|
||||||
|
data = new Uint8Array(arrayBuffer);
|
||||||
|
for (var i = 0; i < body.length; ++i) {
|
||||||
|
data[i] = body[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
callback(error, data);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = function(uri, callback) {
|
||||||
|
if (typeof XMLHttpRequest === 'undefined') {
|
||||||
|
nodeDownload(uri, callback);
|
||||||
|
} else {
|
||||||
|
browserDownload(uri, callback);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
37
src/node.js
37
src/node.js
|
@ -1,21 +1,20 @@
|
||||||
define(['src/constants', 'src/shared'], function(Constants, Shared) {
|
var MODE_FILE = require('./constants.js').MODE_FILE;
|
||||||
|
var guid = require('./shared.js').guid;
|
||||||
|
|
||||||
return function Node(id, mode, size, atime, ctime, mtime, flags, xattrs, nlinks, version) {
|
module.exports = function Node(id, mode, size, atime, ctime, mtime, flags, xattrs, nlinks, version) {
|
||||||
var now = Date.now();
|
var now = Date.now();
|
||||||
|
|
||||||
this.id = id || Shared.guid();
|
this.id = id || guid();
|
||||||
this.mode = mode || Constants.MODE_FILE; // node type (file, directory, etc)
|
this.mode = mode || MODE_FILE; // node type (file, directory, etc)
|
||||||
this.size = size || 0; // size (bytes for files, entries for directories)
|
this.size = size || 0; // size (bytes for files, entries for directories)
|
||||||
this.atime = atime || now; // access time (will mirror ctime after creation)
|
this.atime = atime || now; // access time (will mirror ctime after creation)
|
||||||
this.ctime = ctime || now; // creation/change time
|
this.ctime = ctime || now; // creation/change time
|
||||||
this.mtime = mtime || now; // modified time
|
this.mtime = mtime || now; // modified time
|
||||||
this.flags = flags || []; // file flags
|
this.flags = flags || []; // file flags
|
||||||
this.xattrs = xattrs || {}; // extended attributes
|
this.xattrs = xattrs || {}; // extended attributes
|
||||||
this.nlinks = nlinks || 0; // links count
|
this.nlinks = nlinks || 0; // links count
|
||||||
this.version = version || 0; // node version
|
this.version = version || 0; // node version
|
||||||
this.blksize = undefined; // block size
|
this.blksize = undefined; // block size
|
||||||
this.nblocks = 1; // blocks count
|
this.nblocks = 1; // blocks count
|
||||||
this.data = Shared.guid(); // id for data object
|
this.data = guid(); // id for data object
|
||||||
};
|
};
|
||||||
|
|
||||||
});
|
|
||||||
|
|
|
@ -1,10 +1,6 @@
|
||||||
define(function(require) {
|
module.exports = function OpenFileDescription(path, id, flags, position) {
|
||||||
|
this.path = path;
|
||||||
return function OpenFileDescription(path, id, flags, position) {
|
this.id = id;
|
||||||
this.path = path;
|
this.flags = flags;
|
||||||
this.id = id;
|
this.position = position;
|
||||||
this.flags = flags;
|
};
|
||||||
this.position = position;
|
|
||||||
};
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
345
src/path.js
345
src/path.js
|
@ -20,208 +20,205 @@
|
||||||
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
// Based on https://github.com/joyent/node/blob/41e53e557992a7d552a8e23de035f9463da25c99/lib/path.js
|
// Based on https://github.com/joyent/node/blob/41e53e557992a7d552a8e23de035f9463da25c99/lib/path.js
|
||||||
define(function() {
|
|
||||||
|
|
||||||
// resolves . and .. elements in a path array with directory names there
|
// resolves . and .. elements in a path array with directory names there
|
||||||
// must be no slashes, empty elements, or device names (c:\) in the array
|
// must be no slashes, empty elements, or device names (c:\) in the array
|
||||||
// (so also no leading and trailing slashes - it does not distinguish
|
// (so also no leading and trailing slashes - it does not distinguish
|
||||||
// relative and absolute paths)
|
// relative and absolute paths)
|
||||||
function normalizeArray(parts, allowAboveRoot) {
|
function normalizeArray(parts, allowAboveRoot) {
|
||||||
// if the path tries to go above the root, `up` ends up > 0
|
// if the path tries to go above the root, `up` ends up > 0
|
||||||
var up = 0;
|
var up = 0;
|
||||||
for (var i = parts.length - 1; i >= 0; i--) {
|
for (var i = parts.length - 1; i >= 0; i--) {
|
||||||
var last = parts[i];
|
var last = parts[i];
|
||||||
if (last === '.') {
|
if (last === '.') {
|
||||||
parts.splice(i, 1);
|
parts.splice(i, 1);
|
||||||
} else if (last === '..') {
|
} else if (last === '..') {
|
||||||
parts.splice(i, 1);
|
parts.splice(i, 1);
|
||||||
up++;
|
up++;
|
||||||
} else if (up) {
|
} else if (up) {
|
||||||
parts.splice(i, 1);
|
parts.splice(i, 1);
|
||||||
up--;
|
up--;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// if the path is allowed to go above the root, restore leading ..s
|
|
||||||
if (allowAboveRoot) {
|
|
||||||
for (; up--; up) {
|
|
||||||
parts.unshift('..');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return parts;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Split a filename into [root, dir, basename, ext], unix version
|
// if the path is allowed to go above the root, restore leading ..s
|
||||||
// 'root' is just a slash, or nothing.
|
if (allowAboveRoot) {
|
||||||
var splitPathRe =
|
for (; up--; up) {
|
||||||
/^(\/?)([\s\S]+\/(?!$)|\/)?((?:\.{1,2}$|[\s\S]+?)?(\.[^.\/]*)?)$/;
|
parts.unshift('..');
|
||||||
var splitPath = function(filename) {
|
|
||||||
var result = splitPathRe.exec(filename);
|
|
||||||
return [result[1] || '', result[2] || '', result[3] || '', result[4] || ''];
|
|
||||||
};
|
|
||||||
|
|
||||||
// path.resolve([from ...], to)
|
|
||||||
function resolve() {
|
|
||||||
var resolvedPath = '',
|
|
||||||
resolvedAbsolute = false;
|
|
||||||
|
|
||||||
for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
|
|
||||||
// XXXidbfs: we don't have process.cwd() so we use '/' as a fallback
|
|
||||||
var path = (i >= 0) ? arguments[i] : '/';
|
|
||||||
|
|
||||||
// Skip empty and invalid entries
|
|
||||||
if (typeof path !== 'string' || !path) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
resolvedPath = path + '/' + resolvedPath;
|
|
||||||
resolvedAbsolute = path.charAt(0) === '/';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// At this point the path should be resolved to a full absolute path, but
|
|
||||||
// handle relative paths to be safe (might happen when process.cwd() fails)
|
|
||||||
|
|
||||||
// Normalize the path
|
|
||||||
resolvedPath = normalizeArray(resolvedPath.split('/').filter(function(p) {
|
|
||||||
return !!p;
|
|
||||||
}), !resolvedAbsolute).join('/');
|
|
||||||
|
|
||||||
return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// path.normalize(path)
|
return parts;
|
||||||
function normalize(path) {
|
}
|
||||||
var isAbsolute = path.charAt(0) === '/',
|
|
||||||
trailingSlash = path.substr(-1) === '/';
|
|
||||||
|
|
||||||
// Normalize the path
|
// Split a filename into [root, dir, basename, ext], unix version
|
||||||
path = normalizeArray(path.split('/').filter(function(p) {
|
// 'root' is just a slash, or nothing.
|
||||||
return !!p;
|
var splitPathRe =
|
||||||
}), !isAbsolute).join('/');
|
/^(\/?)([\s\S]+\/(?!$)|\/)?((?:\.{1,2}$|[\s\S]+?)?(\.[^.\/]*)?)$/;
|
||||||
|
var splitPath = function(filename) {
|
||||||
|
var result = splitPathRe.exec(filename);
|
||||||
|
return [result[1] || '', result[2] || '', result[3] || '', result[4] || ''];
|
||||||
|
};
|
||||||
|
|
||||||
if (!path && !isAbsolute) {
|
// path.resolve([from ...], to)
|
||||||
path = '.';
|
function resolve() {
|
||||||
|
var resolvedPath = '',
|
||||||
|
resolvedAbsolute = false;
|
||||||
|
|
||||||
|
for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
|
||||||
|
// XXXidbfs: we don't have process.cwd() so we use '/' as a fallback
|
||||||
|
var path = (i >= 0) ? arguments[i] : '/';
|
||||||
|
|
||||||
|
// Skip empty and invalid entries
|
||||||
|
if (typeof path !== 'string' || !path) {
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
if (path && trailingSlash) {
|
|
||||||
path += '/';
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
return (isAbsolute ? '/' : '') + path;
|
resolvedPath = path + '/' + resolvedPath;
|
||||||
|
resolvedAbsolute = path.charAt(0) === '/';
|
||||||
}
|
}
|
||||||
|
|
||||||
function join() {
|
// At this point the path should be resolved to a full absolute path, but
|
||||||
var paths = Array.prototype.slice.call(arguments, 0);
|
// handle relative paths to be safe (might happen when process.cwd() fails)
|
||||||
return normalize(paths.filter(function(p, index) {
|
|
||||||
return p && typeof p === 'string';
|
// Normalize the path
|
||||||
}).join('/'));
|
resolvedPath = normalizeArray(resolvedPath.split('/').filter(function(p) {
|
||||||
|
return !!p;
|
||||||
|
}), !resolvedAbsolute).join('/');
|
||||||
|
|
||||||
|
return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
|
||||||
|
}
|
||||||
|
|
||||||
|
// path.normalize(path)
|
||||||
|
function normalize(path) {
|
||||||
|
var isAbsolute = path.charAt(0) === '/',
|
||||||
|
trailingSlash = path.substr(-1) === '/';
|
||||||
|
|
||||||
|
// Normalize the path
|
||||||
|
path = normalizeArray(path.split('/').filter(function(p) {
|
||||||
|
return !!p;
|
||||||
|
}), !isAbsolute).join('/');
|
||||||
|
|
||||||
|
if (!path && !isAbsolute) {
|
||||||
|
path = '.';
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
if (path && trailingSlash) {
|
||||||
|
path += '/';
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
return (isAbsolute ? '/' : '') + path;
|
||||||
|
}
|
||||||
|
|
||||||
|
function join() {
|
||||||
|
var paths = Array.prototype.slice.call(arguments, 0);
|
||||||
|
return normalize(paths.filter(function(p, index) {
|
||||||
|
return p && typeof p === 'string';
|
||||||
|
}).join('/'));
|
||||||
|
}
|
||||||
|
|
||||||
|
// path.relative(from, to)
|
||||||
|
function relative(from, to) {
|
||||||
|
from = exports.resolve(from).substr(1);
|
||||||
|
to = exports.resolve(to).substr(1);
|
||||||
|
|
||||||
|
function trim(arr) {
|
||||||
|
var start = 0;
|
||||||
|
for (; start < arr.length; start++) {
|
||||||
|
if (arr[start] !== '') break;
|
||||||
|
}
|
||||||
|
|
||||||
|
var end = arr.length - 1;
|
||||||
|
for (; end >= 0; end--) {
|
||||||
|
if (arr[end] !== '') break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (start > end) return [];
|
||||||
|
return arr.slice(start, end - start + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// path.relative(from, to)
|
var fromParts = trim(from.split('/'));
|
||||||
function relative(from, to) {
|
var toParts = trim(to.split('/'));
|
||||||
from = exports.resolve(from).substr(1);
|
|
||||||
to = exports.resolve(to).substr(1);
|
|
||||||
|
|
||||||
function trim(arr) {
|
var length = Math.min(fromParts.length, toParts.length);
|
||||||
var start = 0;
|
var samePartsLength = length;
|
||||||
for (; start < arr.length; start++) {
|
for (var i = 0; i < length; i++) {
|
||||||
if (arr[start] !== '') break;
|
if (fromParts[i] !== toParts[i]) {
|
||||||
}
|
samePartsLength = i;
|
||||||
|
break;
|
||||||
var end = arr.length - 1;
|
|
||||||
for (; end >= 0; end--) {
|
|
||||||
if (arr[end] !== '') break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (start > end) return [];
|
|
||||||
return arr.slice(start, end - start + 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var fromParts = trim(from.split('/'));
|
|
||||||
var toParts = trim(to.split('/'));
|
|
||||||
|
|
||||||
var length = Math.min(fromParts.length, toParts.length);
|
|
||||||
var samePartsLength = length;
|
|
||||||
for (var i = 0; i < length; i++) {
|
|
||||||
if (fromParts[i] !== toParts[i]) {
|
|
||||||
samePartsLength = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var outputParts = [];
|
|
||||||
for (var i = samePartsLength; i < fromParts.length; i++) {
|
|
||||||
outputParts.push('..');
|
|
||||||
}
|
|
||||||
|
|
||||||
outputParts = outputParts.concat(toParts.slice(samePartsLength));
|
|
||||||
|
|
||||||
return outputParts.join('/');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function dirname(path) {
|
var outputParts = [];
|
||||||
var result = splitPath(path),
|
for (var i = samePartsLength; i < fromParts.length; i++) {
|
||||||
root = result[0],
|
outputParts.push('..');
|
||||||
dir = result[1];
|
|
||||||
|
|
||||||
if (!root && !dir) {
|
|
||||||
// No dirname whatsoever
|
|
||||||
return '.';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dir) {
|
|
||||||
// It has a dirname, strip trailing slash
|
|
||||||
dir = dir.substr(0, dir.length - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return root + dir;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function basename(path, ext) {
|
outputParts = outputParts.concat(toParts.slice(samePartsLength));
|
||||||
var f = splitPath(path)[2];
|
|
||||||
// TODO: make this comparison case-insensitive on windows?
|
return outputParts.join('/');
|
||||||
if (ext && f.substr(-1 * ext.length) === ext) {
|
}
|
||||||
f = f.substr(0, f.length - ext.length);
|
|
||||||
}
|
function dirname(path) {
|
||||||
// XXXidbfs: node.js just does `return f`
|
var result = splitPath(path),
|
||||||
return f === "" ? "/" : f;
|
root = result[0],
|
||||||
|
dir = result[1];
|
||||||
|
|
||||||
|
if (!root && !dir) {
|
||||||
|
// No dirname whatsoever
|
||||||
|
return '.';
|
||||||
}
|
}
|
||||||
|
|
||||||
function extname(path) {
|
if (dir) {
|
||||||
return splitPath(path)[3];
|
// It has a dirname, strip trailing slash
|
||||||
|
dir = dir.substr(0, dir.length - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
function isAbsolute(path) {
|
return root + dir;
|
||||||
if(path.charAt(0) === '/') {
|
}
|
||||||
return true;
|
|
||||||
}
|
function basename(path, ext) {
|
||||||
return false;
|
var f = splitPath(path)[2];
|
||||||
|
// TODO: make this comparison case-insensitive on windows?
|
||||||
|
if (ext && f.substr(-1 * ext.length) === ext) {
|
||||||
|
f = f.substr(0, f.length - ext.length);
|
||||||
}
|
}
|
||||||
|
// XXXidbfs: node.js just does `return f`
|
||||||
|
return f === "" ? "/" : f;
|
||||||
|
}
|
||||||
|
|
||||||
function isNull(path) {
|
function extname(path) {
|
||||||
if (('' + path).indexOf('\u0000') !== -1) {
|
return splitPath(path)[3];
|
||||||
return true;
|
}
|
||||||
}
|
|
||||||
return false;
|
function isAbsolute(path) {
|
||||||
|
if(path.charAt(0) === '/') {
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// XXXidbfs: we don't support path.exists() or path.existsSync(), which
|
function isNull(path) {
|
||||||
// are deprecated, and need a FileSystem instance to work. Use fs.stat().
|
if (('' + path).indexOf('\u0000') !== -1) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
// XXXidbfs: we don't support path.exists() or path.existsSync(), which
|
||||||
normalize: normalize,
|
// are deprecated, and need a FileSystem instance to work. Use fs.stat().
|
||||||
resolve: resolve,
|
|
||||||
join: join,
|
|
||||||
relative: relative,
|
|
||||||
sep: '/',
|
|
||||||
delimiter: ':',
|
|
||||||
dirname: dirname,
|
|
||||||
basename: basename,
|
|
||||||
extname: extname,
|
|
||||||
isAbsolute: isAbsolute,
|
|
||||||
isNull: isNull
|
|
||||||
};
|
|
||||||
|
|
||||||
});
|
module.exports = {
|
||||||
|
normalize: normalize,
|
||||||
|
resolve: resolve,
|
||||||
|
join: join,
|
||||||
|
relative: relative,
|
||||||
|
sep: '/',
|
||||||
|
delimiter: ':',
|
||||||
|
dirname: dirname,
|
||||||
|
basename: basename,
|
||||||
|
extname: extname,
|
||||||
|
isAbsolute: isAbsolute,
|
||||||
|
isNull: isNull
|
||||||
|
};
|
||||||
|
|
|
@ -1,37 +1,26 @@
|
||||||
define(function(require) {
|
function guid() {
|
||||||
|
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
|
||||||
|
var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
|
||||||
|
return v.toString(16);
|
||||||
|
}).toUpperCase();
|
||||||
|
}
|
||||||
|
|
||||||
require("crypto-js/rollups/sha256"); var Crypto = CryptoJS;
|
function nop() {}
|
||||||
|
|
||||||
function guid() {
|
/**
|
||||||
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
|
* Convert a Uint8Array to a regular array
|
||||||
var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
|
*/
|
||||||
return v.toString(16);
|
function u8toArray(u8) {
|
||||||
}).toUpperCase();
|
var array = [];
|
||||||
|
var len = u8.length;
|
||||||
|
for(var i = 0; i < len; i++) {
|
||||||
|
array[i] = u8[i];
|
||||||
}
|
}
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
function hash(string) {
|
module.exports = {
|
||||||
return Crypto.SHA256(string).toString(Crypto.enc.hex);
|
guid: guid,
|
||||||
}
|
u8toArray: u8toArray,
|
||||||
|
nop: nop
|
||||||
function nop() {}
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert a Uint8Array to a regular array
|
|
||||||
*/
|
|
||||||
function u8toArray(u8) {
|
|
||||||
var array = [];
|
|
||||||
var len = u8.length;
|
|
||||||
for(var i = 0; i < len; i++) {
|
|
||||||
array[i] = u8[i];
|
|
||||||
}
|
|
||||||
return array;
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
guid: guid,
|
|
||||||
hash: hash,
|
|
||||||
u8toArray: u8toArray,
|
|
||||||
nop: nop
|
|
||||||
};
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
|
@ -1,20 +1,15 @@
|
||||||
define(function(require) {
|
var defaults = require('../constants.js').ENVIRONMENT;
|
||||||
|
|
||||||
var defaults = require('src/constants').ENVIRONMENT;
|
module.exports = function Environment(env) {
|
||||||
|
env = env || {};
|
||||||
|
env.TMP = env.TMP || defaults.TMP;
|
||||||
|
env.PATH = env.PATH || defaults.PATH;
|
||||||
|
|
||||||
function Environment(env) {
|
this.get = function(name) {
|
||||||
env = env || {};
|
return env[name];
|
||||||
env.TMP = env.TMP || defaults.TMP;
|
};
|
||||||
env.PATH = env.PATH || defaults.PATH;
|
|
||||||
|
|
||||||
this.get = function(name) {
|
this.set = function(name, value) {
|
||||||
return env[name];
|
env[name] = value;
|
||||||
};
|
};
|
||||||
|
};
|
||||||
this.set = function(name, value) {
|
|
||||||
env[name] = value;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return Environment;
|
|
||||||
});
|
|
||||||
|
|
1066
src/shell/shell.js
1066
src/shell/shell.js
File diff suppressed because it is too large
Load Diff
60
src/stats.js
60
src/stats.js
|
@ -1,37 +1,35 @@
|
||||||
define(['src/constants'], function(Constants) {
|
var Constants = require('./constants.js');
|
||||||
|
|
||||||
function Stats(fileNode, devName) {
|
function Stats(fileNode, devName) {
|
||||||
this.node = fileNode.id;
|
this.node = fileNode.id;
|
||||||
this.dev = devName;
|
this.dev = devName;
|
||||||
this.size = fileNode.size;
|
this.size = fileNode.size;
|
||||||
this.nlinks = fileNode.nlinks;
|
this.nlinks = fileNode.nlinks;
|
||||||
this.atime = fileNode.atime;
|
this.atime = fileNode.atime;
|
||||||
this.mtime = fileNode.mtime;
|
this.mtime = fileNode.mtime;
|
||||||
this.ctime = fileNode.ctime;
|
this.ctime = fileNode.ctime;
|
||||||
this.type = fileNode.mode;
|
this.type = fileNode.mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
Stats.prototype.isFile = function() {
|
Stats.prototype.isFile = function() {
|
||||||
return this.type === Constants.MODE_FILE;
|
return this.type === Constants.MODE_FILE;
|
||||||
};
|
};
|
||||||
|
|
||||||
Stats.prototype.isDirectory = function() {
|
Stats.prototype.isDirectory = function() {
|
||||||
return this.type === Constants.MODE_DIRECTORY;
|
return this.type === Constants.MODE_DIRECTORY;
|
||||||
};
|
};
|
||||||
|
|
||||||
Stats.prototype.isSymbolicLink = function() {
|
Stats.prototype.isSymbolicLink = function() {
|
||||||
return this.type === Constants.MODE_SYMBOLIC_LINK;
|
return this.type === Constants.MODE_SYMBOLIC_LINK;
|
||||||
};
|
};
|
||||||
|
|
||||||
// These will always be false in Filer.
|
// These will always be false in Filer.
|
||||||
Stats.prototype.isSocket =
|
Stats.prototype.isSocket =
|
||||||
Stats.prototype.isFIFO =
|
Stats.prototype.isFIFO =
|
||||||
Stats.prototype.isCharacterDevice =
|
Stats.prototype.isCharacterDevice =
|
||||||
Stats.prototype.isBlockDevice =
|
Stats.prototype.isBlockDevice =
|
||||||
function() {
|
function() {
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
return Stats;
|
module.exports = Stats;
|
||||||
|
|
||||||
});
|
|
||||||
|
|
|
@ -1,14 +1,13 @@
|
||||||
define(['src/constants', 'src/shared'], function(Constants, Shared) {
|
var Constants = require('./constants.js');
|
||||||
|
var guid = require('./shared.js').guid;
|
||||||
|
|
||||||
return function SuperNode(atime, ctime, mtime) {
|
module.exports = function SuperNode(atime, ctime, mtime) {
|
||||||
var now = Date.now();
|
var now = Date.now();
|
||||||
|
|
||||||
this.id = Constants.SUPER_NODE_ID;
|
this.id = Constants.SUPER_NODE_ID;
|
||||||
this.mode = Constants.MODE_META;
|
this.mode = Constants.MODE_META;
|
||||||
this.atime = atime || now;
|
this.atime = atime || now;
|
||||||
this.ctime = ctime || now;
|
this.ctime = ctime || now;
|
||||||
this.mtime = mtime || now;
|
this.mtime = mtime || now;
|
||||||
this.rnode = Shared.guid(); // root node id (randomly generated)
|
this.rnode = guid(); // root node id (randomly generated)
|
||||||
};
|
};
|
||||||
|
|
||||||
});
|
|
||||||
|
|
Loading…
Reference in New Issue