419 lines
18 KiB
JavaScript
419 lines
18 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.createDebugStore = exports.clearMaterializedData = void 0;
|
|
var tslib_1 = require("tslib");
|
|
var cron_1 = require("oak-domain/lib/utils/cron");
|
|
var constant_1 = require("../constant/constant");
|
|
var DebugStore_1 = require("./DebugStore");
|
|
var actionDef_1 = require("oak-domain/lib/store/actionDef");
|
|
var assert_1 = require("oak-domain/lib/utils/assert");
|
|
var uuid_1 = require("oak-domain/lib/utils/uuid");
|
|
function initDataInStore(store, initialData, stat) {
|
|
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
return tslib_1.__generator(this, function (_a) {
|
|
store.resetInitialData(initialData, stat);
|
|
return [2 /*return*/];
|
|
});
|
|
});
|
|
}
|
|
function getMaterializedData() {
|
|
if (process.env.OAK_PLATFORM === 'wechatMp') {
|
|
try {
|
|
var data = wx.getStorageSync(constant_1.LOCAL_STORAGE_KEYS.debugStore);
|
|
var stat = wx.getStorageSync(constant_1.LOCAL_STORAGE_KEYS.debugStoreStat);
|
|
if (data && stat) {
|
|
return {
|
|
data: data,
|
|
stat: stat,
|
|
};
|
|
}
|
|
return;
|
|
}
|
|
catch (e) {
|
|
return;
|
|
}
|
|
}
|
|
else if (process.env.OAK_PLATFORM === 'web') {
|
|
try {
|
|
var data = JSON.parse(window.localStorage.getItem(constant_1.LOCAL_STORAGE_KEYS.debugStore));
|
|
var stat = JSON.parse(window.localStorage.getItem(constant_1.LOCAL_STORAGE_KEYS.debugStoreStat));
|
|
if (data && stat) {
|
|
return {
|
|
data: data,
|
|
stat: stat,
|
|
};
|
|
}
|
|
return;
|
|
}
|
|
catch (e) {
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
var lastMaterializedVersion = 0;
|
|
function materializeData(data, stat) {
|
|
if (process.env.OAK_PLATFORM === 'wechatMp') {
|
|
try {
|
|
wx.setStorageSync(constant_1.LOCAL_STORAGE_KEYS.debugStore, data);
|
|
wx.setStorageSync(constant_1.LOCAL_STORAGE_KEYS.debugStoreStat, stat);
|
|
lastMaterializedVersion = stat.commit;
|
|
wx.showToast({
|
|
title: '数据已物化',
|
|
icon: 'success',
|
|
});
|
|
console.log('物化数据', data);
|
|
}
|
|
catch (e) {
|
|
console.error(e);
|
|
wx.showToast({
|
|
title: '物化数据失败',
|
|
icon: 'error',
|
|
});
|
|
}
|
|
}
|
|
else if (process.env.OAK_PLATFORM === 'web') {
|
|
try {
|
|
window.localStorage.setItem(constant_1.LOCAL_STORAGE_KEYS.debugStore, typeof data === 'string' ? data : JSON.stringify(data));
|
|
window.localStorage.setItem(constant_1.LOCAL_STORAGE_KEYS.debugStoreStat, JSON.stringify(stat));
|
|
lastMaterializedVersion = stat.commit;
|
|
console.log('物化数据', data);
|
|
// alert('数据已物化');
|
|
}
|
|
catch (e) {
|
|
console.error(e);
|
|
// alert('物化数据失败');
|
|
}
|
|
}
|
|
}
|
|
function clearMaterializedData() {
|
|
if (process.env.OAK_PLATFORM === 'wechatMp') {
|
|
try {
|
|
wx.removeStorageSync(constant_1.LOCAL_STORAGE_KEYS.debugStore);
|
|
wx.removeStorageSync(constant_1.LOCAL_STORAGE_KEYS.debugStoreStat);
|
|
lastMaterializedVersion = 0;
|
|
wx.showToast({
|
|
title: '数据已清除',
|
|
icon: 'success',
|
|
});
|
|
console.log('清空数据');
|
|
}
|
|
catch (e) {
|
|
console.error(e);
|
|
wx.showToast({
|
|
title: '清空数据失败',
|
|
icon: 'error',
|
|
});
|
|
}
|
|
}
|
|
else if (process.env.OAK_PLATFORM === 'web') {
|
|
try {
|
|
window.localStorage.removeItem(constant_1.LOCAL_STORAGE_KEYS.debugStore);
|
|
window.localStorage.removeItem(constant_1.LOCAL_STORAGE_KEYS.debugStoreStat);
|
|
lastMaterializedVersion = 0;
|
|
console.log('清空数据');
|
|
// alert('数据已物化');
|
|
}
|
|
catch (e) {
|
|
console.error(e);
|
|
// alert('物化数据失败');
|
|
}
|
|
}
|
|
}
|
|
exports.clearMaterializedData = clearMaterializedData;
|
|
/**
|
|
* 在debug环境上创建watcher
|
|
* @param store
|
|
* @param watchers
|
|
*/
|
|
function initializeWatchers(store, contextBuilder, watchers) {
|
|
var count = 0;
|
|
function doWatchers() {
|
|
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
var start, context, watchers_1, watchers_1_1, w, _a, entity, action, filter, actionData, filter2, _b, data, _c, result, _d, _e, _f, _g, entity, projection, fn, filter, filter2, _h, projection2, _j, rows, result, err_1, e_1_1, duration;
|
|
var e_1, _k, _l;
|
|
return tslib_1.__generator(this, function (_m) {
|
|
switch (_m.label) {
|
|
case 0:
|
|
count++;
|
|
start = Date.now();
|
|
return [4 /*yield*/, contextBuilder()(store)];
|
|
case 1:
|
|
context = _m.sent();
|
|
_m.label = 2;
|
|
case 2:
|
|
_m.trys.push([2, 29, 30, 31]);
|
|
watchers_1 = tslib_1.__values(watchers), watchers_1_1 = watchers_1.next();
|
|
_m.label = 3;
|
|
case 3:
|
|
if (!!watchers_1_1.done) return [3 /*break*/, 28];
|
|
w = watchers_1_1.value;
|
|
return [4 /*yield*/, context.begin()];
|
|
case 4:
|
|
_m.sent();
|
|
_m.label = 5;
|
|
case 5:
|
|
_m.trys.push([5, 25, , 27]);
|
|
if (!w.hasOwnProperty('actionData')) return [3 /*break*/, 14];
|
|
_a = w, entity = _a.entity, action = _a.action, filter = _a.filter, actionData = _a.actionData;
|
|
if (!(typeof filter === 'function')) return [3 /*break*/, 7];
|
|
return [4 /*yield*/, filter()];
|
|
case 6:
|
|
_b = _m.sent();
|
|
return [3 /*break*/, 8];
|
|
case 7:
|
|
_b = filter;
|
|
_m.label = 8;
|
|
case 8:
|
|
filter2 = _b;
|
|
if (!(typeof actionData === 'function')) return [3 /*break*/, 10];
|
|
return [4 /*yield*/, actionData()];
|
|
case 9:
|
|
_c = _m.sent();
|
|
return [3 /*break*/, 11];
|
|
case 10:
|
|
_c = actionData;
|
|
_m.label = 11;
|
|
case 11:
|
|
data = _c;
|
|
_e = (_d = store).operate;
|
|
_f = [entity];
|
|
_l = {};
|
|
return [4 /*yield*/, (0, uuid_1.generateNewIdAsync)()];
|
|
case 12: return [4 /*yield*/, _e.apply(_d, _f.concat([(_l.id = _m.sent(),
|
|
_l.action = action,
|
|
_l.data = data,
|
|
_l.filter = filter2,
|
|
_l), context, {
|
|
dontCollect: true,
|
|
}]))];
|
|
case 13:
|
|
result = _m.sent();
|
|
console.log("\u6267\u884C\u4E86watcher\u3010".concat(w.name, "\u3011\uFF0C\u7ED3\u679C\u662F\uFF1A"), result);
|
|
return [3 /*break*/, 23];
|
|
case 14:
|
|
_g = w, entity = _g.entity, projection = _g.projection, fn = _g.fn, filter = _g.filter;
|
|
if (!(typeof filter === 'function')) return [3 /*break*/, 16];
|
|
return [4 /*yield*/, filter()];
|
|
case 15:
|
|
_h = _m.sent();
|
|
return [3 /*break*/, 17];
|
|
case 16:
|
|
_h = filter;
|
|
_m.label = 17;
|
|
case 17:
|
|
filter2 = _h;
|
|
if (!(typeof projection === 'function')) return [3 /*break*/, 19];
|
|
return [4 /*yield*/, projection()];
|
|
case 18:
|
|
_j = _m.sent();
|
|
return [3 /*break*/, 20];
|
|
case 19:
|
|
_j = projection;
|
|
_m.label = 20;
|
|
case 20:
|
|
projection2 = _j;
|
|
return [4 /*yield*/, store.select(entity, {
|
|
data: projection2,
|
|
filter: filter2,
|
|
}, context, {
|
|
dontCollect: true,
|
|
blockTrigger: true,
|
|
})];
|
|
case 21:
|
|
rows = _m.sent();
|
|
return [4 /*yield*/, fn(context, rows)];
|
|
case 22:
|
|
result = _m.sent();
|
|
console.log("\u6267\u884C\u4E86watcher\u3010".concat(w.name, "\u3011\uFF0C\u7ED3\u679C\u662F\uFF1A"), result);
|
|
_m.label = 23;
|
|
case 23: return [4 /*yield*/, context.commit()];
|
|
case 24:
|
|
_m.sent();
|
|
return [3 /*break*/, 27];
|
|
case 25:
|
|
err_1 = _m.sent();
|
|
return [4 /*yield*/, context.rollback()];
|
|
case 26:
|
|
_m.sent();
|
|
console.error("\u6267\u884C\u4E86watcher\u3010".concat(w.name, "\u3011\uFF0C\u53D1\u751F\u9519\u8BEF\uFF1A"), err_1);
|
|
return [3 /*break*/, 27];
|
|
case 27:
|
|
watchers_1_1 = watchers_1.next();
|
|
return [3 /*break*/, 3];
|
|
case 28: return [3 /*break*/, 31];
|
|
case 29:
|
|
e_1_1 = _m.sent();
|
|
e_1 = { error: e_1_1 };
|
|
return [3 /*break*/, 31];
|
|
case 30:
|
|
try {
|
|
if (watchers_1_1 && !watchers_1_1.done && (_k = watchers_1.return)) _k.call(watchers_1);
|
|
}
|
|
finally { if (e_1) throw e_1.error; }
|
|
return [7 /*endfinally*/];
|
|
case 31:
|
|
duration = Date.now() - start;
|
|
console.log("\u7B2C".concat(count, "\u6B21\u6267\u884Cwatchers\uFF0C\u5171\u6267\u884C").concat(watchers.length, "\u4E2A\uFF0C\u8017\u65F6").concat(duration, "\u6BEB\u79D2"));
|
|
setTimeout(function () { return doWatchers(); }, 120000);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
});
|
|
}
|
|
doWatchers();
|
|
}
|
|
function initializeTimers(store, contextBuilder, timers) {
|
|
var e_2, _a;
|
|
var _this = this;
|
|
var _loop_1 = function (timer) {
|
|
var cron = timer.cron, fn = timer.fn, name_1 = timer.name;
|
|
(0, cron_1.schedule)(cron, function (date) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
var start, context, result, err_2;
|
|
return tslib_1.__generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
start = Date.now();
|
|
return [4 /*yield*/, contextBuilder()(store)];
|
|
case 1:
|
|
context = _a.sent();
|
|
return [4 /*yield*/, context.begin()];
|
|
case 2:
|
|
_a.sent();
|
|
console.log("\u5B9A\u65F6\u5668\u3010".concat(name_1, "\u3011\u5F00\u59CB\u6267\u884C\uFF0C\u65F6\u95F4\u662F\u3010").concat(date.toLocaleTimeString(), "\u3011"));
|
|
_a.label = 3;
|
|
case 3:
|
|
_a.trys.push([3, 6, , 8]);
|
|
return [4 /*yield*/, fn(context)];
|
|
case 4:
|
|
result = _a.sent();
|
|
console.log("\u5B9A\u65F6\u5668\u3010".concat(name_1, "\u3011\u6267\u884C\u5B8C\u6210\uFF0C\u8017\u65F6").concat(Date.now() - start, "\u6BEB\u79D2\uFF0C\u7ED3\u679C\u662F\u3010").concat(result, "\u3011"));
|
|
return [4 /*yield*/, context.commit()];
|
|
case 5:
|
|
_a.sent();
|
|
return [3 /*break*/, 8];
|
|
case 6:
|
|
err_2 = _a.sent();
|
|
console.warn("\u5B9A\u65F6\u5668\u3010".concat(name_1, "\u3011\u6267\u884C\u5931\u8D25\uFF0C\u8017\u65F6").concat(Date.now() - start, "\u6BEB\u79D2\uFF0C\u9519\u8BEF\u662F"), err_2);
|
|
return [4 /*yield*/, context.rollback()];
|
|
case 7:
|
|
_a.sent();
|
|
return [3 /*break*/, 8];
|
|
case 8: return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
};
|
|
try {
|
|
for (var timers_1 = tslib_1.__values(timers), timers_1_1 = timers_1.next(); !timers_1_1.done; timers_1_1 = timers_1.next()) {
|
|
var timer = timers_1_1.value;
|
|
_loop_1(timer);
|
|
}
|
|
}
|
|
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
finally {
|
|
try {
|
|
if (timers_1_1 && !timers_1_1.done && (_a = timers_1.return)) _a.call(timers_1);
|
|
}
|
|
finally { if (e_2) throw e_2.error; }
|
|
}
|
|
}
|
|
function doRoutines(store, contextBuilder, routines) {
|
|
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
var routines_1, routines_1_1, routine, name_2, fn, context_1, start, result, err_3, e_3_1;
|
|
var e_3, _a;
|
|
return tslib_1.__generator(this, function (_b) {
|
|
switch (_b.label) {
|
|
case 0:
|
|
_b.trys.push([0, 11, 12, 13]);
|
|
routines_1 = tslib_1.__values(routines), routines_1_1 = routines_1.next();
|
|
_b.label = 1;
|
|
case 1:
|
|
if (!!routines_1_1.done) return [3 /*break*/, 10];
|
|
routine = routines_1_1.value;
|
|
name_2 = routine.name, fn = routine.fn;
|
|
return [4 /*yield*/, contextBuilder()(store)];
|
|
case 2:
|
|
context_1 = _b.sent();
|
|
start = Date.now();
|
|
return [4 /*yield*/, context_1.begin()];
|
|
case 3:
|
|
_b.sent();
|
|
_b.label = 4;
|
|
case 4:
|
|
_b.trys.push([4, 7, , 9]);
|
|
return [4 /*yield*/, fn(context_1)];
|
|
case 5:
|
|
result = _b.sent();
|
|
console.log("\u4F8B\u7A0B\u3010".concat(name_2, "\u3011\u6267\u884C\u5B8C\u6210\uFF0C\u8017\u65F6").concat(Date.now() - start, "\u6BEB\u79D2\uFF0C\u7ED3\u679C\u662F\u3010").concat(result, "\u3011"));
|
|
return [4 /*yield*/, context_1.commit()];
|
|
case 6:
|
|
_b.sent();
|
|
return [3 /*break*/, 9];
|
|
case 7:
|
|
err_3 = _b.sent();
|
|
console.warn("\u4F8B\u7A0B\u3010".concat(name_2, "\u3011\u6267\u884C\u5931\u8D25\uFF0C\u8017\u65F6").concat(Date.now() - start, "\u6BEB\u79D2\uFF0C\u9519\u8BEF\u662F"), err_3);
|
|
return [4 /*yield*/, context_1.rollback()];
|
|
case 8:
|
|
_b.sent();
|
|
return [3 /*break*/, 9];
|
|
case 9:
|
|
routines_1_1 = routines_1.next();
|
|
return [3 /*break*/, 1];
|
|
case 10: return [3 /*break*/, 13];
|
|
case 11:
|
|
e_3_1 = _b.sent();
|
|
e_3 = { error: e_3_1 };
|
|
return [3 /*break*/, 13];
|
|
case 12:
|
|
try {
|
|
if (routines_1_1 && !routines_1_1.done && (_a = routines_1.return)) _a.call(routines_1);
|
|
}
|
|
finally { if (e_3) throw e_3.error; }
|
|
return [7 /*endfinally*/];
|
|
case 13: return [2 /*return*/];
|
|
}
|
|
});
|
|
});
|
|
}
|
|
function createDebugStore(storageSchema, contextBuilder, triggers, checkers, watchers, timers, startRoutines, initialData, actionDict) {
|
|
var store = new DebugStore_1.DebugStore(storageSchema, contextBuilder);
|
|
triggers.forEach(function (ele) { return store.registerTrigger(ele); });
|
|
checkers.forEach(function (ele) { return store.registerChecker(ele); });
|
|
(0, assert_1.assert)(actionDict);
|
|
var _a = (0, actionDef_1.analyzeActionDefDict)(storageSchema, actionDict), adTriggers = _a.triggers, adCheckers = _a.checkers, adWatchers = _a.watchers;
|
|
adTriggers.forEach(function (ele) { return store.registerTrigger(ele); });
|
|
adCheckers.forEach(function (ele) { return store.registerChecker(ele); });
|
|
// 如果没有物化数据则使用initialData初始化debugStore
|
|
var data = getMaterializedData();
|
|
if (!data) {
|
|
initDataInStore(store, initialData);
|
|
console.log('使用初始化数据建立debugStore', initialData);
|
|
}
|
|
else {
|
|
initDataInStore(store, data.data, data.stat);
|
|
console.log('使用物化数据建立debugStore', data);
|
|
}
|
|
lastMaterializedVersion = store.getStat().commit;
|
|
// 启动定期的物化例程
|
|
setInterval(function () {
|
|
var stat = store.getStat();
|
|
if (stat.commit === lastMaterializedVersion) {
|
|
return;
|
|
}
|
|
var data = store.getCurrentData();
|
|
materializeData(data, stat);
|
|
}, 10000);
|
|
// 启动watcher
|
|
initializeWatchers(store, contextBuilder, watchers.concat(adWatchers));
|
|
// 启动timer
|
|
if (timers) {
|
|
initializeTimers(store, contextBuilder, timers);
|
|
}
|
|
// 启动startRoutine
|
|
if (startRoutines) {
|
|
doRoutines(store, contextBuilder, startRoutines);
|
|
}
|
|
return store;
|
|
}
|
|
exports.createDebugStore = createDebugStore;
|