UNPKG

3.92 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.StateQueueManager = void 0;
4var common_1 = require("../common");
5var stateObject_1 = require("./stateObject");
6var StateQueueManager = /** @class */ (function () {
7 function StateQueueManager(router, states, builder, listeners) {
8 this.router = router;
9 this.states = states;
10 this.builder = builder;
11 this.listeners = listeners;
12 this.queue = [];
13 }
14 StateQueueManager.prototype.dispose = function () {
15 this.queue = [];
16 };
17 StateQueueManager.prototype.register = function (stateDecl) {
18 var queue = this.queue;
19 var state = stateObject_1.StateObject.create(stateDecl);
20 var name = state.name;
21 if (!common_1.isString(name))
22 throw new Error('State must have a valid name');
23 if (this.states.hasOwnProperty(name) || common_1.inArray(queue.map(common_1.prop('name')), name))
24 throw new Error("State '" + name + "' is already defined");
25 queue.push(state);
26 this.flush();
27 return state;
28 };
29 StateQueueManager.prototype.flush = function () {
30 var _this = this;
31 var _a = this, queue = _a.queue, states = _a.states, builder = _a.builder;
32 var registered = [], // states that got registered
33 orphans = [], // states that don't yet have a parent registered
34 previousQueueLength = {}; // keep track of how long the queue when an orphan was first encountered
35 var getState = function (name) { return _this.states.hasOwnProperty(name) && _this.states[name]; };
36 var notifyListeners = function () {
37 if (registered.length) {
38 _this.listeners.forEach(function (listener) {
39 return listener('registered', registered.map(function (s) { return s.self; }));
40 });
41 }
42 };
43 while (queue.length > 0) {
44 var state = queue.shift();
45 var name_1 = state.name;
46 var result = builder.build(state);
47 var orphanIdx = orphans.indexOf(state);
48 if (result) {
49 var existingState = getState(name_1);
50 if (existingState && existingState.name === name_1) {
51 throw new Error("State '" + name_1 + "' is already defined");
52 }
53 var existingFutureState = getState(name_1 + '.**');
54 if (existingFutureState) {
55 // Remove future state of the same name
56 this.router.stateRegistry.deregister(existingFutureState);
57 }
58 states[name_1] = state;
59 this.attachRoute(state);
60 if (orphanIdx >= 0)
61 orphans.splice(orphanIdx, 1);
62 registered.push(state);
63 continue;
64 }
65 var prev = previousQueueLength[name_1];
66 previousQueueLength[name_1] = queue.length;
67 if (orphanIdx >= 0 && prev === queue.length) {
68 // Wait until two consecutive iterations where no additional states were dequeued successfully.
69 // throw new Error(`Cannot register orphaned state '${name}'`);
70 queue.push(state);
71 notifyListeners();
72 return states;
73 }
74 else if (orphanIdx < 0) {
75 orphans.push(state);
76 }
77 queue.push(state);
78 }
79 notifyListeners();
80 return states;
81 };
82 StateQueueManager.prototype.attachRoute = function (state) {
83 if (state.abstract || !state.url)
84 return;
85 var rulesApi = this.router.urlService.rules;
86 rulesApi.rule(rulesApi.urlRuleFactory.create(state));
87 };
88 return StateQueueManager;
89}());
90exports.StateQueueManager = StateQueueManager;
91//# sourceMappingURL=stateQueueManager.js.map
\No newline at end of file