const STORAGE_TIMEOUT = 3000; var WEB_API_ORIGIN; var iframeId; var handlers = {}; storage_wrapper = { /** * 初期化処理 * * @param {String} id IFrameのid * @param {String} origin WebStorageの対象origin * * @return {Promise} resolve:空文字 or Null */ initialize: function (id, origin) { var self = this; var result; iframeId = id; WEB_API_ORIGIN = origin; return new Promise(function(resolve) { if (window.hasOwnProperty('Phone')) { resolve(result); } else { self.initPostMessage(function() { result = ''; resolve(result); }) setTimeout(function() { if (!result) { resolve(result); } }, STORAGE_TIMEOUT); } }); }, /** * ローカルストレージからアクセスキーを取得する * * @return {Promise} resolve:アクセスキー */ getRsAccessKey: function () { var self = this; var result = ""; return new Promise(function(resolve, reject) { if (window.hasOwnProperty('Phone')) { var mobilePlatformName = window.Phone.GetPlatformName(); switch (mobilePlatformName) { case "android": resolve(window.Phone.GetAccessKey()); break; case "ios": const promiseId = self.getPromiseId(); handlers[promiseId] = { resolve: resolve, reject: reject }; window.Phone.GetAccessKey(promiseId); break; default: resolve(result); break; } } else { self.getLocalStorage("rsaccesskey", function(accessKey) { result = accessKey; resolve(result); }); setTimeout(function() { if (result == "") { resolve(result); } }, STORAGE_TIMEOUT); } }); }, /** * PromiseIdを取得する * * @return {String} PromiseId */ getPromiseId: function () { var result = String((new Date()).getTime()); const randomBase = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; const randomLength = 32 - result.length; for (var i = 0; i < randomLength; i++) { result += randomBase[Math.floor(Math.random() * randomBase.length)]; } return result; }, /** * アクセスキーをローカルストレージに設定 * * @param {String} accessKey アクセスキー */ setRsAccessKey: function (accessKey) { if (window.hasOwnProperty('Phone')) { window.Phone.SetAccessKey(accessKey); } else { this.setLocalStorage("rsaccesskey", accessKey); } }, /** * メッセージ送受信対象のIFrameを取得する * * @return {Object} メッセージ送受信対象のIFrame */ getIFrame: function () { var iframe = document.getElementById(iframeId); return iframe.contentWindow; }, /** * 初期化処理用PostMessage送受信 * * @param {Function} callback コールバック */ initPostMessage: function (callback) { window.onmessage = function(event) { if (event.origin === WEB_API_ORIGIN) { callback(); } }; var iframe = this.getIFrame(); iframe.postMessage(JSON.stringify({ method: "init" }), "*"); }, /** * 指定されたキーのローカルストレージ設定値を取得する * * @param {String} key キー * @param {Function} callback ローカルストレージの値を受け取るためのコールバック */ getLocalStorage: function (key, callback) { window.onmessage = function(event) { if (event.origin === WEB_API_ORIGIN) { callback(event.data); } }; var iframe = this.getIFrame(); iframe.postMessage(JSON.stringify({ method: "get", key: key }), WEB_API_ORIGIN); }, /** * ローカルストレージに指定されたキーで値を設定する * * @param {String} key キー * @param {String} data 設定値 */ setLocalStorage: function (key, data) { var iframe = this.getIFrame(); iframe.postMessage(JSON.stringify({ method: "set", key: key, data: data }), WEB_API_ORIGIN); }, /** * 指定されたキーのローカルストレージ設定値を削除する * * @param {String} key キー */ removeLocalStorage: function (key) { var iframe = this.getIFrame(); iframe.postMessage(JSON.stringify({ method: "remove", key: key }), WEB_API_ORIGIN); } };