@jswf/core
Version:
JavaScript Window Framework
486 lines • 19 kB
JavaScript
;
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