@pisell/pisellos 2.3.72 → 2.3.74

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/dist/core/index.d.ts +7 -0
  2. package/dist/core/index.js +109 -65
  3. package/dist/modules/OpenData/types.d.ts +1 -0
  4. package/dist/modules/Order/index.d.ts +1 -1
  5. package/dist/modules/Order/utils.js +6 -1
  6. package/dist/modules/Quotation/index.d.ts +6 -0
  7. package/dist/modules/Quotation/index.js +75 -19
  8. package/dist/modules/ResourcePlanner/index.d.ts +0 -22
  9. package/dist/modules/ResourcePlanner/index.js +1 -180
  10. package/dist/modules/ResourcePlanner/localClock.d.ts +33 -0
  11. package/dist/modules/ResourcePlanner/localClock.js +183 -0
  12. package/dist/modules/ResourcePlanner/planner.d.ts +5 -14
  13. package/dist/modules/ResourcePlanner/planner.js +2019 -936
  14. package/dist/modules/ResourcePlanner/types.d.ts +346 -187
  15. package/dist/modules/ResourcePlanner/types.js +33 -1
  16. package/dist/plugins/request.d.ts +1 -0
  17. package/dist/server/index.d.ts +8 -2
  18. package/dist/server/index.js +206 -140
  19. package/dist/server/modules/floor-plan/index.d.ts +4 -0
  20. package/dist/server/modules/floor-plan/index.js +240 -98
  21. package/dist/server/modules/menu/index.js +48 -23
  22. package/dist/server/modules/order/index.d.ts +17 -7
  23. package/dist/server/modules/order/index.js +419 -207
  24. package/dist/server/modules/products/index.d.ts +8 -2
  25. package/dist/server/modules/products/index.js +167 -75
  26. package/dist/server/modules/resource/index.js +21 -13
  27. package/dist/solution/BookingByStep/index.d.ts +1 -1
  28. package/dist/solution/BookingTicket/index.js +4 -2
  29. package/dist/solution/BookingTicket/utils/addProductDecision.d.ts +2 -1
  30. package/dist/solution/BookingTicket/utils/addProductDecision.js +3 -2
  31. package/dist/solution/UnifiedBookingSales/index.d.ts +110 -73
  32. package/dist/solution/UnifiedBookingSales/index.js +3349 -971
  33. package/dist/solution/UnifiedBookingSales/remoteOccupancyCache.d.ts +49 -0
  34. package/dist/solution/UnifiedBookingSales/remoteOccupancyCache.js +430 -0
  35. package/dist/solution/UnifiedBookingSales/types.d.ts +133 -76
  36. package/dist/solution/UnifiedBookingSales/types.js +4 -9
  37. package/lib/core/index.d.ts +7 -0
  38. package/lib/core/index.js +20 -2
  39. package/lib/model/strategy/adapter/promotion/index.js +0 -51
  40. package/lib/modules/OpenData/types.d.ts +1 -0
  41. package/lib/modules/Order/index.d.ts +1 -1
  42. package/lib/modules/Order/utils.js +5 -1
  43. package/lib/modules/Quotation/index.d.ts +6 -0
  44. package/lib/modules/Quotation/index.js +49 -5
  45. package/lib/modules/ResourcePlanner/index.d.ts +0 -22
  46. package/lib/modules/ResourcePlanner/index.js +0 -123
  47. package/lib/modules/ResourcePlanner/localClock.d.ts +33 -0
  48. package/lib/modules/ResourcePlanner/localClock.js +270 -0
  49. package/lib/modules/ResourcePlanner/planner.d.ts +5 -14
  50. package/lib/modules/ResourcePlanner/planner.js +1903 -798
  51. package/lib/modules/ResourcePlanner/types.d.ts +346 -187
  52. package/lib/modules/ResourcePlanner/types.js +19 -0
  53. package/lib/plugins/request.d.ts +1 -0
  54. package/lib/server/index.d.ts +8 -2
  55. package/lib/server/index.js +52 -17
  56. package/lib/server/modules/floor-plan/index.d.ts +4 -0
  57. package/lib/server/modules/floor-plan/index.js +54 -6
  58. package/lib/server/modules/menu/index.js +31 -5
  59. package/lib/server/modules/order/index.d.ts +17 -7
  60. package/lib/server/modules/order/index.js +197 -40
  61. package/lib/server/modules/products/index.d.ts +8 -2
  62. package/lib/server/modules/products/index.js +97 -24
  63. package/lib/server/modules/resource/index.js +7 -2
  64. package/lib/solution/BookingByStep/index.d.ts +1 -1
  65. package/lib/solution/BookingTicket/index.js +2 -1
  66. package/lib/solution/BookingTicket/utils/addProductDecision.d.ts +2 -1
  67. package/lib/solution/BookingTicket/utils/addProductDecision.js +2 -0
  68. package/lib/solution/UnifiedBookingSales/index.d.ts +110 -73
  69. package/lib/solution/UnifiedBookingSales/index.js +2289 -374
  70. package/lib/solution/UnifiedBookingSales/remoteOccupancyCache.d.ts +49 -0
  71. package/lib/solution/UnifiedBookingSales/remoteOccupancyCache.js +376 -0
  72. package/lib/solution/UnifiedBookingSales/types.d.ts +133 -76
  73. package/lib/solution/UnifiedBookingSales/types.js +3 -2
  74. package/package.json +1 -1
@@ -0,0 +1,49 @@
1
+ import type { AvailabilityDateRange } from '../../modules/ResourcePlanner';
2
+ type AvailabilityId = number | string;
3
+ export declare class AvailabilityRemoteOccupancyCache {
4
+ private readonly maxCells;
5
+ private readonly cells;
6
+ private readonly resourceMeta;
7
+ private readonly resourceCellCounts;
8
+ constructor(maxCells?: number);
9
+ clear(): void;
10
+ read(params: {
11
+ scopeKey: string;
12
+ resourceIds: AvailabilityId[];
13
+ dateRange: AvailabilityDateRange;
14
+ }): Record<string, any>[] | null;
15
+ hasCompleteCoverage(params: {
16
+ scopeKey: string;
17
+ resourceIds: AvailabilityId[];
18
+ dateRange: AvailabilityDateRange;
19
+ }): boolean;
20
+ publish(params: {
21
+ scopeKey: string;
22
+ timezoneName: string;
23
+ resourceIds: AvailabilityId[];
24
+ dateRange: AvailabilityDateRange;
25
+ rawResources: Record<string, any>[];
26
+ version: number;
27
+ }): void;
28
+ private buildResourceKey;
29
+ private buildCellKey;
30
+ private touchCell;
31
+ /**
32
+ * A response is one coherent resource snapshot for its requested range. If any overlapping day
33
+ * already contains a newer response, publishing only the older response's remaining days would
34
+ * let a cross-midnight event leak back into that newer day when ranges are recomposed.
35
+ */
36
+ private canPublishResourceRange;
37
+ /**
38
+ * A day cell stores the original event range so it can be reconstructed without losing server
39
+ * identity. When a newer adjacent-day response replaces that event, evict older neighbour cells
40
+ * whose event overlaps the refreshed range. The next wider read becomes a cache miss instead of
41
+ * reintroducing stale occupancy from the neighbour.
42
+ */
43
+ private invalidateAdjacentOverlappingCells;
44
+ private deleteCell;
45
+ private deleteResourceCells;
46
+ private writeResourceMeta;
47
+ private writeCell;
48
+ }
49
+ export {};
@@ -0,0 +1,430 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ var _excluded = ["event_list"];
3
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
4
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
5
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
7
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
8
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
9
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
10
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
11
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
12
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
13
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
14
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
15
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
16
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
17
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
18
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
19
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
20
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
21
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
22
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
23
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
24
+ import { cloneDeep } from 'lodash-es';
25
+ import { addLocalCalendarDays, dateOrdinalFromLocalDate, formatLocalDate, localDateTimeToScalar, localDateToScalarStart, nextDate, parseLocalDateTime } from "../../modules/ResourcePlanner/localClock";
26
+ function uniqueIds(values) {
27
+ var result = new Map();
28
+ values.forEach(function (value) {
29
+ if (value === undefined || value === null || value === '') return;
30
+ result.set(String(value), value);
31
+ });
32
+ return Array.from(result.values());
33
+ }
34
+ function buildDateList(dateRange) {
35
+ if (!(dateRange !== null && dateRange !== void 0 && dateRange.startDate) || !(dateRange !== null && dateRange !== void 0 && dateRange.endDate)) return [];
36
+ try {
37
+ var startOrdinal = dateOrdinalFromLocalDate(dateRange.startDate);
38
+ var endOrdinal = dateOrdinalFromLocalDate(dateRange.endDate);
39
+ if (endOrdinal < startOrdinal) return [];
40
+ var dates = [];
41
+ var cursor = localDateToScalarStart(dateRange.startDate);
42
+ for (var ordinal = startOrdinal; ordinal <= endOrdinal; ordinal += 1) {
43
+ dates.push(formatLocalDate(cursor));
44
+ cursor = addLocalCalendarDays(cursor, 1);
45
+ }
46
+ return dates;
47
+ } catch (_unused) {
48
+ return [];
49
+ }
50
+ }
51
+ function resolveResourceId(raw) {
52
+ var _ref, _raw$resourceId;
53
+ var id = (_ref = (_raw$resourceId = raw.resourceId) !== null && _raw$resourceId !== void 0 ? _raw$resourceId : raw.resource_id) !== null && _ref !== void 0 ? _ref : raw.id;
54
+ if (id === undefined || id === null || id === '') return null;
55
+ return id;
56
+ }
57
+ function getRawEventStartAt(rawEvent) {
58
+ var _ref2, _ref3, _rawEvent$start_at;
59
+ var startAt = (_ref2 = (_ref3 = (_rawEvent$start_at = rawEvent.start_at) !== null && _rawEvent$start_at !== void 0 ? _rawEvent$start_at : rawEvent.startAt) !== null && _ref3 !== void 0 ? _ref3 : rawEvent.start_time) !== null && _ref2 !== void 0 ? _ref2 : rawEvent.startTime;
60
+ return startAt ? String(startAt) : null;
61
+ }
62
+ function getRawEventEndAt(rawEvent) {
63
+ var _ref4, _ref5, _rawEvent$end_at;
64
+ var endAt = (_ref4 = (_ref5 = (_rawEvent$end_at = rawEvent.end_at) !== null && _rawEvent$end_at !== void 0 ? _rawEvent$end_at : rawEvent.endAt) !== null && _ref5 !== void 0 ? _ref5 : rawEvent.end_time) !== null && _ref4 !== void 0 ? _ref4 : rawEvent.endTime;
65
+ return endAt ? String(endAt) : null;
66
+ }
67
+ function parseEventScalar(value) {
68
+ return localDateTimeToScalar(parseLocalDateTime(value));
69
+ }
70
+ function buildEventIdentity(resourceId, rawEvent) {
71
+ var _rawEvent$schedule_ev, _ref6, _rawEvent$booking_uid, _rawEvent$metadata, _ref7, _rawEvent$product_uid, _rawEvent$metadata2;
72
+ var scheduleEventId = (_rawEvent$schedule_ev = rawEvent.schedule_event_id) !== null && _rawEvent$schedule_ev !== void 0 ? _rawEvent$schedule_ev : rawEvent.scheduleEventId;
73
+ if (scheduleEventId !== undefined && scheduleEventId !== null && scheduleEventId !== '') {
74
+ return "scheduleEvent:".concat(String(resourceId), ":").concat(String(scheduleEventId));
75
+ }
76
+ var bookingUid = (_ref6 = (_rawEvent$booking_uid = rawEvent.booking_uid) !== null && _rawEvent$booking_uid !== void 0 ? _rawEvent$booking_uid : rawEvent.bookingUid) !== null && _ref6 !== void 0 ? _ref6 : (_rawEvent$metadata = rawEvent.metadata) === null || _rawEvent$metadata === void 0 ? void 0 : _rawEvent$metadata.unique_identification_number;
77
+ if (bookingUid !== undefined && bookingUid !== null && bookingUid !== '') {
78
+ return "bookingUid:".concat(String(resourceId), ":").concat(String(bookingUid));
79
+ }
80
+ var productUid = (_ref7 = (_rawEvent$product_uid = rawEvent.product_uid) !== null && _rawEvent$product_uid !== void 0 ? _rawEvent$product_uid : rawEvent.productUid) !== null && _ref7 !== void 0 ? _ref7 : (_rawEvent$metadata2 = rawEvent.metadata) === null || _rawEvent$metadata2 === void 0 ? void 0 : _rawEvent$metadata2.product_uid;
81
+ if (productUid !== undefined && productUid !== null && productUid !== '') {
82
+ return "productUid:".concat(String(resourceId), ":").concat(String(productUid));
83
+ }
84
+ return ['range', String(resourceId), getRawEventStartAt(rawEvent) || '', getRawEventEndAt(rawEvent) || ''].join(':');
85
+ }
86
+ function bucketEventDates(params) {
87
+ var startAt = getRawEventStartAt(params.rawEvent);
88
+ var endAt = getRawEventEndAt(params.rawEvent);
89
+ if (!startAt || !endAt) return [];
90
+ try {
91
+ var startScalar = parseEventScalar(startAt);
92
+ var endScalar = parseEventScalar(endAt);
93
+ if (endScalar <= startScalar) return [];
94
+ var endInclusiveScalar = endScalar - 1000;
95
+ var startDate = formatLocalDate(startScalar);
96
+ var endDate = formatLocalDate(endInclusiveScalar);
97
+ var startOrdinal = dateOrdinalFromLocalDate(startDate);
98
+ var endOrdinal = dateOrdinalFromLocalDate(endDate);
99
+ if (endOrdinal < startOrdinal) return [];
100
+ var dates = [];
101
+ var cursorDate = startDate;
102
+ for (var ordinal = startOrdinal; ordinal <= endOrdinal; ordinal += 1) {
103
+ if (params.requestedDates.has(cursorDate)) {
104
+ dates.push(cursorDate);
105
+ }
106
+ cursorDate = nextDate(cursorDate);
107
+ }
108
+ return dates;
109
+ } catch (_unused2) {
110
+ return [];
111
+ }
112
+ }
113
+ function sortEventList(events) {
114
+ return _toConsumableArray(events).sort(function (left, right) {
115
+ var _ref8, _left$resource_id, _ref9, _right$resource_id;
116
+ var leftStart = getRawEventStartAt(left) || '';
117
+ var rightStart = getRawEventStartAt(right) || '';
118
+ if (leftStart !== rightStart) return leftStart.localeCompare(rightStart);
119
+ var leftEnd = getRawEventEndAt(left) || '';
120
+ var rightEnd = getRawEventEndAt(right) || '';
121
+ if (leftEnd !== rightEnd) return leftEnd.localeCompare(rightEnd);
122
+ return buildEventIdentity((_ref8 = (_left$resource_id = left.resource_id) !== null && _left$resource_id !== void 0 ? _left$resource_id : left.resourceId) !== null && _ref8 !== void 0 ? _ref8 : '', left).localeCompare(buildEventIdentity((_ref9 = (_right$resource_id = right.resource_id) !== null && _right$resource_id !== void 0 ? _right$resource_id : right.resourceId) !== null && _ref9 !== void 0 ? _ref9 : '', right));
123
+ });
124
+ }
125
+ export var AvailabilityRemoteOccupancyCache = /*#__PURE__*/function () {
126
+ function AvailabilityRemoteOccupancyCache() {
127
+ var maxCells = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 4096;
128
+ _classCallCheck(this, AvailabilityRemoteOccupancyCache);
129
+ _defineProperty(this, "maxCells", void 0);
130
+ _defineProperty(this, "cells", new Map());
131
+ _defineProperty(this, "resourceMeta", new Map());
132
+ _defineProperty(this, "resourceCellCounts", new Map());
133
+ this.maxCells = maxCells;
134
+ }
135
+ _createClass(AvailabilityRemoteOccupancyCache, [{
136
+ key: "clear",
137
+ value: function clear() {
138
+ this.cells.clear();
139
+ this.resourceMeta.clear();
140
+ this.resourceCellCounts.clear();
141
+ }
142
+ }, {
143
+ key: "read",
144
+ value: function read(params) {
145
+ var _this = this;
146
+ var requestedResourceIds = uniqueIds(params.resourceIds);
147
+ var requestedDates = buildDateList(params.dateRange);
148
+ if (requestedResourceIds.length === 0 || requestedDates.length === 0) return [];
149
+ var resources = [];
150
+ var _iterator = _createForOfIteratorHelper(requestedResourceIds),
151
+ _step;
152
+ try {
153
+ var _loop = function _loop() {
154
+ var resourceId = _step.value;
155
+ var resourceKey = _this.buildResourceKey(params.scopeKey, resourceId);
156
+ var eventList = new Map();
157
+ var _iterator2 = _createForOfIteratorHelper(requestedDates),
158
+ _step2;
159
+ try {
160
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
161
+ var date = _step2.value;
162
+ var cellKey = _this.buildCellKey(resourceKey, date);
163
+ var cell = _this.touchCell(cellKey);
164
+ if (!cell) return {
165
+ v: null
166
+ };
167
+ cell.eventList.forEach(function (rawEvent) {
168
+ eventList.set(buildEventIdentity(resourceId, rawEvent), cloneDeep(rawEvent));
169
+ });
170
+ }
171
+ } catch (err) {
172
+ _iterator2.e(err);
173
+ } finally {
174
+ _iterator2.f();
175
+ }
176
+ var metadataEntry = _this.resourceMeta.get(resourceKey);
177
+ if (!metadataEntry) return {
178
+ v: null
179
+ };
180
+ if (metadataEntry.status === 'absent') return 0; // continue
181
+ if (!metadataEntry.metadata) return {
182
+ v: null
183
+ };
184
+ resources.push(_objectSpread(_objectSpread({}, cloneDeep(metadataEntry.metadata)), {}, {
185
+ event_list: sortEventList(Array.from(eventList.values()))
186
+ }));
187
+ },
188
+ _ret;
189
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
190
+ _ret = _loop();
191
+ if (_ret === 0) continue;
192
+ if (_ret) return _ret.v;
193
+ }
194
+ } catch (err) {
195
+ _iterator.e(err);
196
+ } finally {
197
+ _iterator.f();
198
+ }
199
+ return resources;
200
+ }
201
+ }, {
202
+ key: "hasCompleteCoverage",
203
+ value: function hasCompleteCoverage(params) {
204
+ var requestedResourceIds = uniqueIds(params.resourceIds);
205
+ var requestedDates = buildDateList(params.dateRange);
206
+ if (requestedResourceIds.length === 0 || requestedDates.length === 0) return true;
207
+ var _iterator3 = _createForOfIteratorHelper(requestedResourceIds),
208
+ _step3;
209
+ try {
210
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
211
+ var resourceId = _step3.value;
212
+ var resourceKey = this.buildResourceKey(params.scopeKey, resourceId);
213
+ var _iterator4 = _createForOfIteratorHelper(requestedDates),
214
+ _step4;
215
+ try {
216
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
217
+ var date = _step4.value;
218
+ var cell = this.cells.get(this.buildCellKey(resourceKey, date));
219
+ if (!cell) return false;
220
+ }
221
+ } catch (err) {
222
+ _iterator4.e(err);
223
+ } finally {
224
+ _iterator4.f();
225
+ }
226
+ }
227
+ } catch (err) {
228
+ _iterator3.e(err);
229
+ } finally {
230
+ _iterator3.f();
231
+ }
232
+ return true;
233
+ }
234
+ }, {
235
+ key: "publish",
236
+ value: function publish(params) {
237
+ var _this2 = this;
238
+ var requestedResourceIds = uniqueIds(params.resourceIds);
239
+ var requestedDates = buildDateList(params.dateRange);
240
+ if (requestedResourceIds.length === 0 || requestedDates.length === 0) return;
241
+ var requestedDateSet = new Set(requestedDates);
242
+ var publishedAt = Date.now();
243
+ var requestedResourceKeyById = new Map(requestedResourceIds.map(function (resourceId) {
244
+ return [String(resourceId), _this2.buildResourceKey(params.scopeKey, resourceId)];
245
+ }));
246
+ var rawResourceById = new Map();
247
+ (params.rawResources || []).forEach(function (rawResource) {
248
+ var resourceId = resolveResourceId(rawResource);
249
+ if (resourceId !== null && requestedResourceKeyById.has(String(resourceId))) {
250
+ rawResourceById.set(String(resourceId), rawResource);
251
+ }
252
+ });
253
+ requestedResourceIds.forEach(function (resourceId) {
254
+ var resourceKey = requestedResourceKeyById.get(String(resourceId));
255
+ if (!resourceKey) return;
256
+ if (!_this2.canPublishResourceRange(resourceKey, requestedDates, params.version)) return;
257
+ var rawResource = rawResourceById.get(String(resourceId));
258
+ var nextStatus = rawResource ? 'present' : 'absent';
259
+ var currentMetadata = _this2.resourceMeta.get(resourceKey);
260
+ if (currentMetadata && currentMetadata.version <= params.version && currentMetadata.status !== nextStatus) {
261
+ _this2.deleteResourceCells(resourceKey);
262
+ }
263
+ _this2.invalidateAdjacentOverlappingCells({
264
+ resourceKey: resourceKey,
265
+ requestedDates: requestedDateSet,
266
+ timezoneName: params.timezoneName
267
+ });
268
+ var metadata = rawResource ? function (_ref10) {
269
+ var _eventList = _ref10.event_list,
270
+ rest = _objectWithoutProperties(_ref10, _excluded);
271
+ return rest;
272
+ }(rawResource) : undefined;
273
+ _this2.writeResourceMeta(resourceKey, nextStatus, metadata, params.version);
274
+ var eventsByDate = new Map();
275
+ requestedDates.forEach(function (date) {
276
+ eventsByDate.set(date, new Map());
277
+ });
278
+ var eventList = Array.isArray(rawResource === null || rawResource === void 0 ? void 0 : rawResource.event_list) ? rawResource.event_list : [];
279
+ eventList.forEach(function (event) {
280
+ var rawEvent = cloneDeep(event);
281
+ var identity = buildEventIdentity(resourceId, rawEvent);
282
+ bucketEventDates({
283
+ rawEvent: rawEvent,
284
+ timezoneName: params.timezoneName,
285
+ requestedDates: requestedDateSet
286
+ }).forEach(function (date) {
287
+ var _eventsByDate$get;
288
+ (_eventsByDate$get = eventsByDate.get(date)) === null || _eventsByDate$get === void 0 || _eventsByDate$get.set(identity, rawEvent);
289
+ });
290
+ });
291
+ requestedDates.forEach(function (date) {
292
+ var _eventsByDate$get2;
293
+ _this2.writeCell({
294
+ key: _this2.buildCellKey(resourceKey, date),
295
+ resourceKey: resourceKey,
296
+ version: params.version,
297
+ eventList: sortEventList(Array.from(((_eventsByDate$get2 = eventsByDate.get(date)) === null || _eventsByDate$get2 === void 0 ? void 0 : _eventsByDate$get2.values()) || [])),
298
+ fetchedAt: publishedAt,
299
+ lastAccessedAt: publishedAt
300
+ });
301
+ });
302
+ });
303
+ }
304
+ }, {
305
+ key: "buildResourceKey",
306
+ value: function buildResourceKey(scopeKey, resourceId) {
307
+ return "".concat(scopeKey, ":").concat(String(resourceId));
308
+ }
309
+ }, {
310
+ key: "buildCellKey",
311
+ value: function buildCellKey(resourceKey, date) {
312
+ return "".concat(resourceKey, ":").concat(date);
313
+ }
314
+ }, {
315
+ key: "touchCell",
316
+ value: function touchCell(cellKey) {
317
+ var entry = this.cells.get(cellKey);
318
+ if (!entry) return null;
319
+ entry.lastAccessedAt = Date.now();
320
+ this.cells.delete(cellKey);
321
+ this.cells.set(cellKey, entry);
322
+ return entry;
323
+ }
324
+
325
+ /**
326
+ * A response is one coherent resource snapshot for its requested range. If any overlapping day
327
+ * already contains a newer response, publishing only the older response's remaining days would
328
+ * let a cross-midnight event leak back into that newer day when ranges are recomposed.
329
+ */
330
+ }, {
331
+ key: "canPublishResourceRange",
332
+ value: function canPublishResourceRange(resourceKey, requestedDates, version) {
333
+ var _this3 = this;
334
+ var metadata = this.resourceMeta.get(resourceKey);
335
+ if (metadata && metadata.version > version) return false;
336
+ return requestedDates.every(function (date) {
337
+ var current = _this3.cells.get(_this3.buildCellKey(resourceKey, date));
338
+ return !current || current.version <= version;
339
+ });
340
+ }
341
+
342
+ /**
343
+ * A day cell stores the original event range so it can be reconstructed without losing server
344
+ * identity. When a newer adjacent-day response replaces that event, evict older neighbour cells
345
+ * whose event overlaps the refreshed range. The next wider read becomes a cache miss instead of
346
+ * reintroducing stale occupancy from the neighbour.
347
+ */
348
+ }, {
349
+ key: "invalidateAdjacentOverlappingCells",
350
+ value: function invalidateAdjacentOverlappingCells(params) {
351
+ var _this4 = this;
352
+ var keysToDelete = [];
353
+ this.cells.forEach(function (cell, cellKey) {
354
+ if (cell.resourceKey !== params.resourceKey) return;
355
+ var cellDate = cellKey.slice(cell.resourceKey.length + 1);
356
+ if (params.requestedDates.has(cellDate)) return;
357
+ var overlapsRequestedDate = cell.eventList.some(function (rawEvent) {
358
+ return bucketEventDates({
359
+ rawEvent: rawEvent,
360
+ timezoneName: params.timezoneName,
361
+ requestedDates: params.requestedDates
362
+ }).length > 0;
363
+ });
364
+ if (overlapsRequestedDate) keysToDelete.push(cellKey);
365
+ });
366
+ keysToDelete.forEach(function (cellKey) {
367
+ return _this4.deleteCell(cellKey);
368
+ });
369
+ }
370
+ }, {
371
+ key: "deleteCell",
372
+ value: function deleteCell(cellKey) {
373
+ var entry = this.cells.get(cellKey);
374
+ if (!entry) return;
375
+ this.cells.delete(cellKey);
376
+ var nextCount = (this.resourceCellCounts.get(entry.resourceKey) || 1) - 1;
377
+ if (nextCount <= 0) {
378
+ this.resourceCellCounts.delete(entry.resourceKey);
379
+ this.resourceMeta.delete(entry.resourceKey);
380
+ return;
381
+ }
382
+ this.resourceCellCounts.set(entry.resourceKey, nextCount);
383
+ }
384
+ }, {
385
+ key: "deleteResourceCells",
386
+ value: function deleteResourceCells(resourceKey) {
387
+ var _this5 = this;
388
+ var keysToDelete = [];
389
+ this.cells.forEach(function (cell, cellKey) {
390
+ if (cell.resourceKey === resourceKey) keysToDelete.push(cellKey);
391
+ });
392
+ keysToDelete.forEach(function (cellKey) {
393
+ return _this5.deleteCell(cellKey);
394
+ });
395
+ }
396
+ }, {
397
+ key: "writeResourceMeta",
398
+ value: function writeResourceMeta(resourceKey, status, metadata, version) {
399
+ var current = this.resourceMeta.get(resourceKey);
400
+ if (current && current.version > version) return;
401
+ this.resourceMeta.set(resourceKey, {
402
+ version: version,
403
+ status: status,
404
+ metadata: metadata ? cloneDeep(metadata) : undefined
405
+ });
406
+ }
407
+ }, {
408
+ key: "writeCell",
409
+ value: function writeCell(entry) {
410
+ var current = this.cells.get(entry.key);
411
+ if (current && current.version > entry.version) return;
412
+ if (!current) {
413
+ this.resourceCellCounts.set(entry.resourceKey, (this.resourceCellCounts.get(entry.resourceKey) || 0) + 1);
414
+ } else {
415
+ this.cells.delete(entry.key);
416
+ }
417
+ this.cells.set(entry.key, _objectSpread(_objectSpread({}, entry), {}, {
418
+ eventList: cloneDeep(entry.eventList)
419
+ }));
420
+ while (this.cells.size > this.maxCells) {
421
+ var oldest = this.cells.entries().next().value;
422
+ if (!oldest) break;
423
+ var _oldest = _slicedToArray(oldest, 1),
424
+ oldestKey = _oldest[0];
425
+ this.deleteCell(oldestKey);
426
+ }
427
+ }
428
+ }]);
429
+ return AvailabilityRemoteOccupancyCache;
430
+ }();