UNPKG

electron-event-flux

Version:

Redux store which synchronizes between instances in multiple process

163 lines (162 loc) 6.92 kB
"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;