Created
March 23, 2015 13:35
-
-
Save uupaa/5cdbde4ad1c39455f2bf to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| (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