Spaces:
Sleeping
Sleeping
File size: 3,368 Bytes
2574e86 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | /* app-route-state.js - snapshot-scoped route geometry loading */
(function () {
'use strict';
var FSR = window.FSR = window.FSR || {};
FSR.createRouteGeometryController = function (options) {
var currentPlanIdentity = null;
var currentRouteIdentity = null;
var routeInFlightIdentity = null;
var latestRouteIdentity = null;
var routeRequestToken = 0;
return {
identityFrom: identityFrom,
invalidate: invalidate,
load: load,
setPlanIdentity: setPlanIdentity,
};
function invalidate() {
routeRequestToken += 1;
currentPlanIdentity = null;
currentRouteIdentity = null;
routeInFlightIdentity = null;
latestRouteIdentity = null;
if (options.onClearFocus) options.onClearFocus();
options.onRoutesChange(null);
}
function setPlanIdentity(identity) {
currentPlanIdentity = identity;
if (!identityEquals(currentRouteIdentity, identity)) {
currentRouteIdentity = null;
options.onRoutesChange(null);
}
}
function load(identity) {
if (!identity) return Promise.resolve();
latestRouteIdentity = identity;
if (routeInFlightIdentity || identityEquals(currentRouteIdentity, identity)) {
return Promise.resolve();
}
return fetchLatest();
}
function fetchLatest() {
var identity = latestRouteIdentity;
if (!identity || routeInFlightIdentity || identityEquals(currentRouteIdentity, identity)) {
return Promise.resolve();
}
var token = routeRequestToken;
routeInFlightIdentity = identity;
return options.utils.fetchJobRoutes(identity.jobId, identity.snapshotRevision)
.then(function (routes) {
if (!responseStillCurrent(token, identity)) return;
currentRouteIdentity = identity;
options.onRoutesChange(routes);
})
.catch(function (err) {
if (!responseStillCurrent(token, identity)) return;
currentRouteIdentity = null;
options.onRoutesChange(null);
console.error('Route geometry failed:', err);
})
.then(function () {
if (identityEquals(routeInFlightIdentity, identity)) routeInFlightIdentity = null;
if (
latestRouteIdentity
&& !identityEquals(latestRouteIdentity, identity)
&& responseStillCurrent(token, latestRouteIdentity)
&& !identityEquals(currentRouteIdentity, latestRouteIdentity)
) {
return fetchLatest();
}
});
}
function identityFrom(meta) {
var jobId = meta && meta.jobId != null ? meta.jobId : options.solver.getJobId();
var snapshotRevision = meta && meta.snapshotRevision != null
? meta.snapshotRevision
: options.solver.getSnapshotRevision();
if (jobId == null || jobId === '' || snapshotRevision == null) return null;
return { jobId: String(jobId), snapshotRevision: String(snapshotRevision) };
}
function responseStillCurrent(token, identity) {
return token === routeRequestToken && identityEquals(currentPlanIdentity, identity);
}
function identityEquals(left, right) {
return !!left
&& !!right
&& left.jobId === right.jobId
&& left.snapshotRevision === right.snapshotRevision;
}
};
})();
|