UNPKG

@jswf/core

Version:

JavaScript Window Framework

486 lines 19 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; Object.defineProperty(exports, "__esModule", { value: true }); /** *Ajax通信用アダプタ * * @export * @class Adapter */ var Adapter = /** @class */ (function () { /** *Creates an instance of Adapter. * @param {string} [scriptUrl] 通信先アドレス * @param {string} [keyName] セッション情報記憶用キー * @memberof Adapter */ function Adapter(scriptUrl, keyName) { this.functionSet = []; this.scriptUrl = scriptUrl || "./"; this.keyName = (keyName || "") + "Session"; this.handle = null; } Adapter.prototype.getKeyName = function () { return this.keyName; }; /** *サーバに対して命令を単独実行 *呼び出し内容をまとめない * @param {string} funcName ファンクション名(className.functionName) * @param {...unknown[]} params パラメータ * @returns {Promise<never>} * @memberof Adapter */ Adapter.prototype.execAlone = function (funcName) { var params = []; for (var _i = 1; _i < arguments.length; _i++) { params[_i - 1] = arguments[_i]; } var functionSet = { functions: [ { name: funcName, params: params } ], promise: {}, array: false }; var promise = new Promise(function (resolve, reject) { functionSet.promise.resolve = resolve; functionSet.promise.reject = reject; }); this.send([functionSet]); return promise; }; /** *戻り値をバイナリとして受け取る(ファイルダウンロード用) *命令は単独実行される * @param {string} funcName * @param {...unknown[]} params * @returns {Promise<never>} * @memberof Adapter */ Adapter.prototype.execBinary = function (funcName) { var params = []; for (var _i = 1; _i < arguments.length; _i++) { params[_i - 1] = arguments[_i]; } var functionSet = { functions: [ { name: funcName, params: params } ], promise: {}, array: false }; var promise = new Promise(function (resolve, reject) { functionSet.promise.resolve = resolve; functionSet.promise.reject = reject; }); this.send([functionSet], true); return promise; }; // eslint-disable-next-line no-dupe-class-members Adapter.prototype.exec = function (v1) { var v2 = []; for (var _i = 1; _i < arguments.length; _i++) { v2[_i - 1] = arguments[_i]; } var functionSet; if (Array.isArray(v1)) { var functions = []; for (var _a = 0, _b = v1; _a < _b.length; _a++) { var func = _b[_a]; functions.push({ name: func[0], params: func.slice(1) }); } functionSet = { functions: functions, promise: {}, array: true }; } else { functionSet = { functions: [{ name: v1, params: v2 }], promise: {}, array: false }; } var promise = new Promise(function (resolve, reject) { functionSet.promise.resolve = resolve; functionSet.promise.reject = reject; }); this.functionSet.push(functionSet); this.callSend(); return promise; }; /** *同じタイミングで発生した複数命令をプールして同時に実行する * * @private * @memberof Adapter */ Adapter.prototype.callSend = function () { var _this = this; if (!this.handle) { this.handle = window.setTimeout(function () { _this.handle = null; _this.send(_this.functionSet); }, 0); } }; /** *命令の実行と受け取り処理 * * @private * @param {FunctionSet[]} functionSet * @param {boolean} [binary] * @returns * @memberof Adapter */ Adapter.prototype.send = function (functionSet, binary) { return __awaiter(this, void 0, void 0, function () { var globalHash, sessionHash, params, _i, functionSet_1, funcs, _a, _b, func, res, _c, functionSet_2, funcs, _d, functionSet_3, funcs, results, index, _e, functionSet_4, funcs, length_1, values, i, result; return __generator(this, function (_f) { switch (_f.label) { case 0: globalHash = localStorage.getItem(this.keyName); sessionHash = sessionStorage.getItem(this.keyName); params = { globalHash: globalHash, sessionHash: sessionHash, functions: [] }; this.functionSet = []; for (_i = 0, functionSet_1 = functionSet; _i < functionSet_1.length; _i++) { funcs = functionSet_1[_i]; for (_a = 0, _b = funcs.functions; _a < _b.length; _a++) { func = _b[_a]; params.functions.push({ function: func.name, params: func.params }); } } return [4 /*yield*/, Adapter.sendJsonAsync(this.scriptUrl + "?cmd=exec", params, undefined, binary)]; case 1: res = (_f.sent()); if (res === null) { for (_c = 0, functionSet_2 = functionSet; _c < functionSet_2.length; _c++) { funcs = functionSet_2[_c]; // eslint-disable-next-line no-console console.error("通信エラー"); funcs.promise.reject("通信エラー"); } return [2 /*return*/]; } //バイナリデータはそのまま返却 if (binary) { for (_d = 0, functionSet_3 = functionSet; _d < functionSet_3.length; _d++) { funcs = functionSet_3[_d]; funcs.promise.resolve(res); } return [2 /*return*/]; } //セッションキーの更新 if (res.globalHash) localStorage.setItem(this.keyName, res.globalHash); if (res.sessionHash) sessionStorage.setItem(this.keyName, res.sessionHash); results = res.results; index = 0; for (_e = 0, functionSet_4 = functionSet; _e < functionSet_4.length; _e++) { funcs = functionSet_4[_e]; length_1 = funcs.functions.length; if (funcs.array) { values = []; for (i = index; i < length_1; i++) { if (results[i].error) { // eslint-disable-next-line no-console console.error(results[i].error); funcs.promise.reject(results[i].error); break; } values.push(results[i].value); } funcs.promise.resolve(values); } else { result = results[index]; // eslint-disable-next-line no-console if (result.error) console.error(result.error); else funcs.promise.resolve(result.value); } index += length_1; } return [2 /*return*/]; } }); }); }; /** *Jsonデータ送受信とPromise化 * * @static * @param {string} url * @param {unknown} [data] * @param {{ [key: string]: string }} [headers] * @param {boolean} [binary] * @returns {Promise<unknown>} * @memberof Adapter */ Adapter.sendJsonAsync = function (url, data, headers, binary) { return new Promise(function (resolve) { if (binary) { Adapter.sendJsonToBinary(url, data, function (value) { resolve(value); }, headers); } else { Adapter.sendJson(url, data, function (value) { resolve(value); }, headers); } }); }; /** *Jsonデータの送受信 * * @private * @static * @param {string} url * @param {unknown} data * @param {Function} proc * @param {{ [key: string]: string }} [headers] * @returns {void} * @memberof Adapter */ Adapter.sendJson = function (url, data, proc, headers) { var req = new XMLHttpRequest(); //ネイティブでJSON変換が可能かチェック var jsonFlag = false; try { req.responseType = "json"; } catch (e) { jsonFlag = true; } if (proc == null) { req.open("POST", url, false); return JSON.parse(req.responseText); } else { req.onreadystatechange = function () { if (req.readyState == 4) { var obj = null; try { if (jsonFlag) //JSON変換の仕分け obj = JSON.parse(req.response); else obj = req.response; } catch (e) { proc(null); return; } proc(obj); } }; } req.open("POST", url, true); req.setRequestHeader("Content-Type", "application/json"); if (headers) { for (var index in headers) { var value = sessionStorage.getItem(headers[index]); if (value) req.setRequestHeader(index, value); } } req.send(data == null ? null : JSON.stringify(data)); }; /** *Jsonデータの送信とblobの受け取り * * @private * @static * @param {string} url * @param {unknown} data * @param {Function} proc * @param {{ [key: string]: string }} [headers] * @returns {void} * @memberof Adapter */ Adapter.sendJsonToBinary = function (url, data, proc, headers) { var req = new XMLHttpRequest(); req.responseType = "blob"; if (proc == null) { req.open("POST", url, false); return JSON.parse(req.responseText); } else { req.onreadystatechange = function () { if (req.readyState == 4) { proc(req.response); } }; } req.open("POST", url, true); req.setRequestHeader("Content-Type", "application/json"); if (headers) { for (var index in headers) { var value = sessionStorage.getItem(headers[index]); if (value) req.setRequestHeader(index, value); } } req.send(data == null ? null : JSON.stringify(data)); }; /** *ファイルのアップロード *パラメータはURLに設定される * * @param {Blob} buffer * @param {string} funcName * @param {...unknown[]} params * @returns * @memberof Adapter */ Adapter.prototype.upload = function (buffer, funcName) { var _this = this; var params = []; for (var _i = 2; _i < arguments.length; _i++) { params[_i - 2] = arguments[_i]; } return new Promise(function (resolve, reject) { //ハッシュデータの読み出し var globalHash = localStorage.getItem(_this.keyName); var sessionHash = sessionStorage.getItem(_this.keyName); var adapterFormat = { globalHash: globalHash, sessionHash: sessionHash, functions: [ { function: funcName, params: params } ] }; var proc = function (res) { if (res == null) { // eslint-disable-next-line no-console console.error("通信エラー"); reject("通信エラー"); } else { if (res.globalHash) localStorage.setItem(_this.keyName, res.globalHash); if (res.sessionHash) sessionStorage.setItem(_this.keyName, res.sessionHash); if (res.results && res.results.length) { var result = res.results[0]; if (result.error) reject(result.error); else resolve(result.value); } else { resolve(null); } } }; //ファイルデータの送信 Adapter.sendFile(_this.scriptUrl + "?cmd=upload", buffer, proc, { params: JSON.stringify(adapterFormat) }); }); }; /** *ファイル送信 * * @static * @param {string} url * @param {Blob} buffer * @param {(result: never) => void} proc * @param {({ [key: string]: string | number })} params * @returns * @memberof Adapter */ Adapter.sendFile = function (url, buffer, proc, params) { //GETパラメータの構築 var urlParam = ""; if (params) { for (var _i = 0, _a = Object.keys(params); _i < _a.length; _i++) { var key = _a[_i]; if (urlParam.length) urlParam += "&"; urlParam += encodeURIComponent(key) + "=" + encodeURIComponent(params[key]); } url += url.indexOf("?") >= 0 ? "&" : "?"; url += urlParam; } //データ送信 var req = new XMLHttpRequest(); try { req.open("POST", url, true); req.setRequestHeader("Content-Type", "application/octet-stream"); req.send(buffer); } catch (e) { alert(e); return null; } req.onreadystatechange = function () { if (req.readyState == 4) { proc(JSON.parse(req.response)); } }; return req; }; return Adapter; }()); exports.Adapter = Adapter; //# sourceMappingURL=Adapter.js.map