electron-event-flux
Version:
Redux store which synchronizes between instances in multiple process
163 lines (162 loc) • 6.92 kB
JavaScript
"use strict";
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
var AppStore_1 = require("./AppStore");
var objectMerge_1 = require("./utils/objectMerge");
var json_immutable_bn_1 = require("json-immutable-bn");
var StoreProxyHandler_1 = require("./utils/StoreProxyHandler");
var RendererClient_1 = require("./RendererClient");
var event_kit_1 = require("event-kit");
var filterStore_1 = require("./utils/filterStore");
var loggerApply_1 = require("./utils/loggerApply");
var IDGenerator = /** @class */ (function () {
function IDGenerator() {
this.count = 0;
}
IDGenerator.prototype.genID = function () {
return ++this.count;
};
IDGenerator.prototype.dispose = function (id) {
};
return IDGenerator;
}());
var RendererAppStore = /** @class */ (function (_super) {
__extends(RendererAppStore, _super);
function RendererAppStore(log) {
var _this = _super.call(this) || this;
_this.emitter = new event_kit_1.Emitter();
_this.idGenerator = new IDGenerator();
_this.resolveMap = {};
_this.storeProxyHandler = new StoreProxyHandler_1.default();
_this.handleStorePromise = function (state, store) {
_this.handleStore(_this.storeResolve, _this.storeReject, state, store);
};
_this.log = log;
return _this;
}
RendererAppStore.prototype.asyncInit = function () {
var _this = this;
_super.prototype.init.call(this);
// 先初始化,防止由于promise的异步 漏掉某些消息
this.client = new RendererClient_1.default(this.handleStorePromise, this.handleAction.bind(this), this.handleResult.bind(this), this.handleMessage.bind(this), this.handleWinMessage.bind(this), this.handleInitWindow.bind(this), this.log);
return new Promise(function (resolve, reject) {
_this.storeResolve = resolve;
_this.storeReject = reject;
});
};
RendererAppStore.prototype.handleStore = function (resolve, reject, state, store) {
var _this = this;
try {
var storeData = json_immutable_bn_1.deserialize(state);
var initialState = storeData;
this.state = initialState;
var storeFilters = JSON.parse(store);
var stores = this.storeProxyHandler.proxyStores(storeFilters, function (action) {
var invokeId = _this.idGenerator.genID();
_this.client.forward(invokeId, json_immutable_bn_1.serialize(action));
return new Promise(function (resolve, reject) { return _this.resolveMap[invokeId] = { resolve: resolve, reject: reject }; });
});
this.stores = stores;
this.initRenderStores();
resolve();
}
catch (err) {
reject(err);
}
};
RendererAppStore.prototype.handleAction = function (actionStr) {
var action = json_immutable_bn_1.deserialize(actionStr);
var _a = action.payload, updated = _a.updated, deleted = _a.deleted;
// const withDeletions = filterObject(this.state, deleted);
if (!this.state)
return;
this.state = objectMerge_1.default(this.state, updated, deleted);
this.batchUpdater.requestUpdate();
};
RendererAppStore.prototype.handleResult = function (invokeId, error, result) {
this.idGenerator.dispose(invokeId);
var _a = this.resolveMap[invokeId], resolve = _a.resolve, reject = _a.reject;
delete this.resolveMap[invokeId];
if (error) {
reject(error);
}
else {
// if (result !== undefined) result = JSON.parse(result);
resolve(result);
}
};
RendererAppStore.prototype.handleMessage = function (message) {
this.emitter.emit('did-message', message);
};
RendererAppStore.prototype.handleWinMessage = function (senderId, message) {
this.emitter.emit('did-win-message', { senderId: senderId, message: message });
};
RendererAppStore.prototype.handleInitWindow = function (params) {
this.winInitParams = params;
this.emitter.emit('did-init-window', params);
this.log(function (logger) { return logger("RendererAppStore", "init window", params); });
};
RendererAppStore.prototype.observeInitWindow = function (callback) {
if (this.winInitParams) {
callback(this.winInitParams);
}
else {
this.emitter.on('did-init-window', callback);
}
};
RendererAppStore.prototype.sendWindowMessage = function (clientId, args) {
this.client.sendWindowMessage(clientId, args);
};
RendererAppStore.prototype.onDidMessage = function (callback) {
return this.emitter.on('did-message', callback);
};
RendererAppStore.prototype.onDidClose = function (callback) {
return this.emitter.on('did-message', function (message) {
if (message && message.action === 'did-close')
callback();
});
};
RendererAppStore.prototype.onDidWinMessage = function (callback) {
return this.emitter.on('did-win-message', callback);
};
RendererAppStore.prototype.initRenderStores = function () {
this.buildStores();
this.initStores(this);
this.startObserve();
};
RendererAppStore.prototype.getStore = function (key) {
return this.stores[key];
};
RendererAppStore.prototype.setStore = function (key, store) {
return this.stores[key] = store;
};
// 构建子Stores
RendererAppStore.prototype.buildStores = function () { };
// 初始化子Stores
RendererAppStore.prototype.initStores = function (parent) { };
// 开始监听子Store改变
RendererAppStore.prototype.startObserve = function () { };
return RendererAppStore;
}(AppStore_1.default));
exports.RendererAppStore = RendererAppStore;
function buildRendererAppStore(stores, onChange, logger) {
RendererAppStore.innerStores = stores;
var storeShape = filterStore_1.filterOneStore(RendererAppStore);
var appStore = new RendererAppStore(loggerApply_1.default(logger));
appStore.onDidChange(onChange);
appStore.storeShape = storeShape;
return appStore;
}
exports.default = buildRendererAppStore;