Skip to content

Instantly share code, notes, and snippets.

@uupaa
Created March 23, 2015 13:35
Show Gist options
  • Select an option

  • Save uupaa/5cdbde4ad1c39455f2bf to your computer and use it in GitHub Desktop.

Select an option

Save uupaa/5cdbde4ad1c39455f2bf to your computer and use it in GitHub Desktop.
(function(global) {
"use strict";
// --- dependency modules ----------------------------------
var Hash = global["Hash"];
// --- define / local variables ----------------------------
//var _isNodeOrNodeWebKit = !!global.global;
//var _runOnNodeWebKit = _isNodeOrNodeWebKit && /native/.test(setTimeout);
//var _runOnNode = _isNodeOrNodeWebKit && !/native/.test(setTimeout);
//var _runOnWorker = !_isNodeOrNodeWebKit && "WorkerLocation" in global;
//var _runOnBrowser = !_isNodeOrNodeWebKit && "document" in global;
var performance = (global["performance"] &&
global["performance"]["now"]) ? global["performance"]
: Date;
// SENSOR
function DEVICE_MOTION(global) {
// --- define / local variables ----------------------------
// --- class / interfaces ----------------------------------
function DeviceMotion(callback) { // @arg Function - callback({ type: "HeartBeat" });
// devicemotionイベントで、加速度センサーの値を継続的に取得することができます。
global.addEventListener("devicemotion", function(event) {
// ユーザーによる加速度 + 重力
var x = event.accelerationIncludingGravity.x; // 左右
var y = event.accelerationIncludingGravity.y; // 上下
var z = event.accelerationIncludingGravity.z; // 前後
var html = 'ユーザー加速度+重力: <br>x=' + x + "<br> y=" + y + "<br> z=" + z;
info.innerHTML = html;
// ユーザーによる加速度
var x = event.acceleration.x; // 左右
var y = event.acceleration.y; // 上下
var z = event.acceleration.z; // 前後
var html = 'ユーザー加速度: <br>x=' + x + "<br> y=" + y + "<br> z=" + z;
info2.innerHTML = html;
// 前回呼び出しからの経過時間
info3.innerHTML = '前回からの時間: <br>' + event.interval;
});
Object.freeze(this);
}
// --- implements ------------------------------------------
// --- exports ---------------------------------------------
return DeviceMotion;
}
function HEART_BEAT(global) {
// --- define / local variables ----------------------------
var PULSE_INTERVAL = 5 * 1000; // 20sec
var lastTimeStamp = 0;
// --- class / interfaces ----------------------------------
function HeartBeat(callback) { // @arg Function - callback({ type: "HeartBeat" });
this._callback = callback;
this._tick = _tick.bind(this);
this._tid = setInterval(this._tick, PULSE_INTERVAL);
if (lastTimeStamp) { throw new Error("duplicate running"); }
lastTimeStamp = Date.now();
Object.freeze(this);
}
// --- implements ------------------------------------------
function _tick() {
var timeStamp = Date.now();
var deltaTime = timeStamp - lastTimeStamp;
if (deltaTime < PULSE_INTERVAL ||
deltaTime > PULSE_INTERVAL * 2) {
this._callback({ "type": "HeartBeat", "data": { "deltaTime": deltaTime } });
}
lastTimeStamp = timeStamp;
}
// --- exports ---------------------------------------------
return HeartBeat;
}
function FINGERPRINT(global) {
// --- class / interfaces ----------------------------------
function Fingerprint(spec) { // @arg Spec
this._canvas = spec["CANVAS_FINGERPRINT"];
this._gpu = spec["GPU_FINGERPRINT"];
Object.freeze(this);
}
Fingerprint["prototype"] = Object.create(Fingerprint, {
"constructor": { "value": Fingerprint },
"canvas": { "get": function() { return this._canvas; } },
"gpu": { "get": function() { return this._gpu; } },
});
// --- implements ------------------------------------------
// --- exports ---------------------------------------------
return Fingerprint;
}
function USER_TIMELINE(global) {
// --- class / interfaces ----------------------------------
function UserTimeline() {
this._timeline = []; // [{ event }, ... ]
}
UserTimeline["prototype"] = Object.create(UserTimeline, {
"constructor": { "value": UserTimeline },
"dump": { "value": function() { return this._timeline; } },
"add": { "value": UserTimeline_add },
"clear": { "value": UserTimeline_clear },
});
// --- implements ------------------------------------------
function UserTimeline_add(param) { // @arg Object - { time, type, data }
// @param.time - Number - HighresTimeStampNumber
// @param.type - String
// @param.data - Any
var time = param["time"] || performance["now"]();
var type = param["type"] || "";
var data = param["data"] || "";
var event = { "time": time, "type": type, "data": data };
this._timeline.push(event);
console.log("add user timeline", JSON.stringify(event));
}
function UserTimeline_dump() {
return this._timeline;
}
function UserTimeline_clear() {
this._timeline.length = 0;
}
// --- exports ---------------------------------------------
return UserTimeline;
}
// --- validate / assertions -------------------------------
//{@dev
//function $valid(val, fn, hint) { if (global["Valid"]) { global["Valid"](val, fn, hint); } }
//function $type(obj, type) { return global["Valid"] ? global["Valid"].type(obj, type) : true; }
//function $keys(obj, str) { return global["Valid"] ? global["Valid"].keys(obj, str) : true; }
//function $some(val, str, ignore) { return global["Valid"] ? global["Valid"].some(val, str, ignore) : true; }
//function $args(fn, args) { if (global["Valid"]) { global["Valid"].args(fn, args); } }
//}@dev
// --- exports ---------------------------------------------
Object.freeze(global["SecureWorker"] = {
HeartBeat: HEART_BEAT(global),
Fingerprint: FINGERPRINT(global),
UserTimeline: USER_TIMELINE(global),
HASH: Object.freeze({
HeartBeat: Hash["XXHash"](Hash["STR_U8A"]("" + HEART_BEAT)),
Fingerprint: Hash["XXHash"](Hash["STR_U8A"]("" + FINGERPRINT)),
UserTimeline: Hash["XXHash"](Hash["STR_U8A"]("" + USER_TIMELINE)),
})
});
})((this || 0).self || global);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment