@rxx/worker
Version:
React MVI micro framework.
236 lines • 20.1 kB
JavaScript
"use strict";
/**
* The MIT License (MIT)
* Copyright (c) Taketoshi Aono
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
* @fileoverview
* @author Taketoshi Aono
*/
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var rxjs_1 = require("rxjs");
var intent_1 = require("./intent/intent");
var state_handler_1 = require("./handler/state-handler");
var utils_1 = require("./utils");
var combine_template_1 = require("./observable/combine-template");
var subject_1 = require("./subject");
/**
* Group of stores.
* That merge multiple store state to one monolithic state.
*/
var StoreGroup = /** @class */ (function () {
function StoreGroup(intent, stores, service, subject) {
this.intent = intent;
this.stores = stores;
this.service = service;
this.subject = subject;
this.storeInstances = [];
}
/**
* @returns Merged state.
*/
StoreGroup.prototype.initialize = function () {
var _this = this;
return this.stores.reduce(function (state, Store) {
var store = new Store(_this.intent, _this.service, _this.subject.observable);
var nextState = store.initialize();
_this.storeInstances.push(store);
if (nextState.view) {
state.view = utils_1.mergeDeep(state.view, nextState.view);
}
for (var key in nextState) {
if (key !== 'view') {
if (!nextState[key] || !(nextState[key] instanceof rxjs_1.Observable)) {
throw new Error("Property " + key + " must be Observable.");
}
if (state[key]) {
state[key] = state[key].merge(nextState[key]);
}
else {
state[key] = nextState[key];
}
}
}
return state;
}, { view: {} });
};
StoreGroup.prototype.getStores = function () {
return this.storeInstances;
};
return StoreGroup;
}());
var BUFFERING_TIME = 10;
var Provisioning = /** @class */ (function () {
function Provisioning(intentConstructors, storeConstructors, stateFactory, service, stateHandlers, intentAdvice) {
if (stateFactory === void 0) { stateFactory = function (_, a) { return a; }; }
if (service === void 0) { service = {}; }
if (stateHandlers === void 0) { stateHandlers = {}; }
if (intentAdvice === void 0) { intentAdvice = function (v) { return v; }; }
this.intentConstructors = intentConstructors;
this.storeConstructors = storeConstructors;
this.stateFactory = stateFactory;
this.service = service;
this.stateHandlers = stateHandlers;
this.intentAdvice = intentAdvice;
this.isDisposed = false;
this.handlerSubscriptions = [];
this.subscribers = [];
this.handlers = {};
this.cache = null;
}
Provisioning.prototype.dispose = function (removeCache) {
if (removeCache === void 0) { removeCache = true; }
this.isDisposed = true;
this.subscription && this.subscription.unsubscribe();
this.subscription = null;
this.handlerSubscriptions.forEach(function (s) { return s.unsubscribe(); });
if (removeCache) {
this.cache = null;
}
};
Provisioning.prototype.prepare = function (parentState) {
var _this = this;
if (parentState === void 0) { parentState = {}; }
if (!this.intent) {
this.intent = new intent_1.Intent();
this.subject = new subject_1.SubjectTree();
}
this.handlers = state_handler_1.getHandlers();
if (this.stateHandlers) {
utils_1.forIn(this.stateHandlers, function (v, k) {
_this.handlers[k] = v;
});
}
if (!this.cache) {
this.cache = {};
var intentInstance = {};
for (var key in this.intentConstructors) {
intentInstance[key] = this.intentAdvice(new this.intentConstructors[key](function (type, payload) {
_this.subject.notify({ type: type, payload: payload });
_this.intent.push(type, payload);
}, tslib_1.__assign({ intent: this.intent.response }, utils_1.mapValues(this.handlers, function (v) { return v.response; }))));
}
this.cache.intentInstance = intentInstance;
var storeGroup = (this.cache.storeGroup = new StoreGroup(intentInstance, this.storeConstructors, this.service, this.subject));
this.cache.storeState = this.stateFactory(this.subject.observable, storeGroup.initialize());
this.cache.stores = storeGroup.getStores();
}
var intentHandler = function (type, payload) {
_this.intent.push(type, payload);
_this.subject.notify({ type: type, payload: payload });
};
utils_1.forIn(this.handlers, function (handler) {
handler.setIntent(intentHandler);
handler.setSubject(_this.subject);
});
if (this.isDisposed || !this.subscription) {
var state = tslib_1.__assign({}, this.cache.storeState);
this.subscribeHandler(state);
var firstTime_1 = true;
var timer_1 = 0;
this.subscription = combine_template_1.combineTemplate(state).subscribe(function (state) {
if (firstTime_1) {
firstTime_1 = false;
state.view = tslib_1.__assign({}, parentState, state.view);
_this.notifyUpdate(state);
}
else {
clearTimeout(timer_1);
timer_1 = setTimeout(function () {
state.view = tslib_1.__assign({}, parentState, state.view);
_this.notifyUpdate(state);
}, BUFFERING_TIME);
}
}, function (error) {
console.error(error);
});
}
this.isDisposed = false;
};
Provisioning.prototype.emitAsync = function (emitter) {
setTimeout(emitter, BUFFERING_TIME);
};
Provisioning.prototype.getPublisher = function () {
var _this = this;
var ret = function (type, payload) {
_this.intent.push(type, payload);
_this.subject.notify({ type: type, payload: payload });
};
ret.subscribe = function (callback) {
_this.intent.subscribeEvent(function (type, payload) {
return callback({ type: type, payload: payload });
});
_this.subject.subscribe(callback);
};
ret.unsubscribe = function () {
_this.intent.unsubscribeAll();
_this.subject.unsubscribeAll();
};
return ret;
};
Provisioning.prototype.getState = function () {
return this.state;
};
Provisioning.prototype.getHandlers = function () {
return this.handlers;
};
Provisioning.prototype.subscribe = function (subscriber, runInitial) {
var _this = this;
if (runInitial === void 0) { runInitial = false; }
this.subscribers.push(subscriber);
if (runInitial) {
subscriber(this.state, true);
}
return function () {
var index = -1;
_this.subscribers.some(function (v, i) {
if (v === subscriber) {
index = i;
return true;
}
return false;
});
_this.subscribers.splice(index, 1);
};
};
Provisioning.prototype.getStores = function () {
return this.cache.storeGroup.getStores();
};
Provisioning.prototype.getIntentInstance = function () {
return this.cache.intentInstance;
};
Provisioning.prototype.subscribeHandler = function (state) {
for (var key in this.handlers) {
this.handlerSubscriptions.push(this.handlers[key].subscribe(state));
}
};
Provisioning.prototype.notifyUpdate = function (newState) {
this.state = newState;
this.subject.setState(newState);
this.intent.setState(newState);
utils_1.forIn(this.handlers, function (v) { return v.setState(newState); });
this.subscribers.forEach(function (subscriber) { return subscriber(newState); });
};
Provisioning.prototype.notifyUpdateView = function (viewState) {
var _this = this;
this.state.view = viewState;
this.subject.setState(this.state);
this.intent.setState(this.state);
utils_1.forIn(this.handlers, function (v) { return v.setState(_this.state); });
this.subscribers.forEach(function (subscriber) { return subscriber(_this.state); });
};
return Provisioning;
}());
exports.Provisioning = Provisioning;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlzaW9uaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Byb3Zpc2lvbmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHOzs7QUFFSCw2QkFBeUQ7QUFFekQsMENBQXlFO0FBRXpFLHlEQUFvRTtBQUNwRSxpQ0FBK0Q7QUFDL0Qsa0VBQWdFO0FBQ2hFLHFDQUF3QztBQVV4Qzs7O0dBR0c7QUFDSDtJQUdFLG9CQUNVLE1BQXNDLEVBQ3RDLE1BQW9DLEVBQ3BDLE9BQStCLEVBQy9CLE9BQW9CO1FBSHBCLFdBQU0sR0FBTixNQUFNLENBQWdDO1FBQ3RDLFdBQU0sR0FBTixNQUFNLENBQThCO1FBQ3BDLFlBQU8sR0FBUCxPQUFPLENBQXdCO1FBQy9CLFlBQU8sR0FBUCxPQUFPLENBQWE7UUFOdEIsbUJBQWMsR0FBaUIsRUFBRSxDQUFDO0lBT3ZDLENBQUM7SUFFSjs7T0FFRztJQUNJLCtCQUFVLEdBQWpCO1FBQUEsaUJBOEJDO1FBN0JDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQ3ZCLFVBQUMsS0FBSyxFQUFFLEtBQUs7WUFDWCxJQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FDckIsS0FBSSxDQUFDLE1BQU0sRUFDWCxLQUFJLENBQUMsT0FBTyxFQUNaLEtBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUN4QixDQUFDO1lBQ0YsSUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFVBQVcsRUFBRSxDQUFDO1lBQ3RDLEtBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hDLElBQUksU0FBUyxDQUFDLElBQUksRUFBRTtnQkFDbEIsS0FBSyxDQUFDLElBQUksR0FBRyxpQkFBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3BEO1lBQ0QsS0FBSyxJQUFNLEdBQUcsSUFBSSxTQUFT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