@2112-lab/central-plant 0.2.12 → 0.3.0

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.
@@ -0,0 +1,502 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var _rollupPluginBabelHelpers = require('../../../_virtual/_rollupPluginBabelHelpers.js');
6
+ var S3CacheService = require('./S3CacheService.js');
7
+
8
+ var CACHE_KEY = 's3-component-metadata';
9
+ var CACHE_VERSION = 1;
10
+
11
+ /**
12
+ * Simple mutex implementation for preventing concurrent read-modify-write operations
13
+ */
14
+ var SimpleMutex = /*#__PURE__*/function () {
15
+ function SimpleMutex() {
16
+ _rollupPluginBabelHelpers.classCallCheck(this, SimpleMutex);
17
+ this._locked = false;
18
+ this._queue = [];
19
+ }
20
+ return _rollupPluginBabelHelpers.createClass(SimpleMutex, [{
21
+ key: "acquire",
22
+ value: function () {
23
+ var _acquire = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee() {
24
+ var _this = this;
25
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context) {
26
+ while (1) switch (_context.n) {
27
+ case 0:
28
+ return _context.a(2, new Promise(function (resolve) {
29
+ if (!_this._locked) {
30
+ _this._locked = true;
31
+ resolve();
32
+ } else {
33
+ _this._queue.push(resolve);
34
+ }
35
+ }));
36
+ }
37
+ }, _callee);
38
+ }));
39
+ function acquire() {
40
+ return _acquire.apply(this, arguments);
41
+ }
42
+ return acquire;
43
+ }()
44
+ }, {
45
+ key: "release",
46
+ value: function release() {
47
+ if (this._queue.length > 0) {
48
+ var next = this._queue.shift();
49
+ next();
50
+ } else {
51
+ this._locked = false;
52
+ }
53
+ }
54
+ }]);
55
+ }();
56
+ var S3MetadataCacheService = /*#__PURE__*/function () {
57
+ function S3MetadataCacheService() {
58
+ _rollupPluginBabelHelpers.classCallCheck(this, S3MetadataCacheService);
59
+ this._mutex = new SimpleMutex();
60
+ this._memoryCache = null;
61
+ this._memoryCacheTime = 0;
62
+ this._memoryCacheTTL = 5000; // 5 seconds in-memory cache
63
+ }
64
+
65
+ /**
66
+ * Create empty metadata structure
67
+ */
68
+ return _rollupPluginBabelHelpers.createClass(S3MetadataCacheService, [{
69
+ key: "_createEmptyMetadata",
70
+ value: function _createEmptyMetadata() {
71
+ return {
72
+ version: CACHE_VERSION,
73
+ components: [],
74
+ timestamp: Date.now()
75
+ };
76
+ }
77
+
78
+ /**
79
+ * Validate and migrate metadata if needed
80
+ */
81
+ }, {
82
+ key: "_validateMetadata",
83
+ value: function _validateMetadata(metadata) {
84
+ if (!metadata) {
85
+ return this._createEmptyMetadata();
86
+ }
87
+
88
+ // Ensure components array exists
89
+ if (!Array.isArray(metadata.components)) {
90
+ metadata.components = [];
91
+ }
92
+
93
+ // Add version if missing (for legacy cache)
94
+ if (metadata.version === undefined) {
95
+ metadata.version = CACHE_VERSION;
96
+ }
97
+ return metadata;
98
+ }
99
+
100
+ /**
101
+ * Check if memory cache is still valid
102
+ */
103
+ }, {
104
+ key: "_isMemoryCacheValid",
105
+ value: function _isMemoryCacheValid() {
106
+ return this._memoryCache !== null && Date.now() - this._memoryCacheTime < this._memoryCacheTTL;
107
+ }
108
+
109
+ /**
110
+ * Invalidate the memory cache
111
+ */
112
+ }, {
113
+ key: "_invalidateMemoryCache",
114
+ value: function _invalidateMemoryCache() {
115
+ this._memoryCache = null;
116
+ this._memoryCacheTime = 0;
117
+ }
118
+
119
+ /**
120
+ * Get all cached components
121
+ * @returns {Promise<Array>} Array of cached component metadata
122
+ */
123
+ }, {
124
+ key: "getAll",
125
+ value: (function () {
126
+ var _getAll = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee2() {
127
+ var metadata, validated, _t;
128
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context2) {
129
+ while (1) switch (_context2.n) {
130
+ case 0:
131
+ if (!this._isMemoryCacheValid()) {
132
+ _context2.n = 1;
133
+ break;
134
+ }
135
+ return _context2.a(2, _rollupPluginBabelHelpers.toConsumableArray(this._memoryCache.components));
136
+ case 1:
137
+ _context2.p = 1;
138
+ _context2.n = 2;
139
+ return S3CacheService.getCachedJsonData(CACHE_KEY);
140
+ case 2:
141
+ metadata = _context2.v;
142
+ validated = this._validateMetadata(metadata); // Update memory cache
143
+ this._memoryCache = validated;
144
+ this._memoryCacheTime = Date.now();
145
+ return _context2.a(2, _rollupPluginBabelHelpers.toConsumableArray(validated.components));
146
+ case 3:
147
+ _context2.p = 3;
148
+ _t = _context2.v;
149
+ console.warn('⚠️ S3MetadataCacheService: Failed to get components:', _t);
150
+ return _context2.a(2, []);
151
+ }
152
+ }, _callee2, this, [[1, 3]]);
153
+ }));
154
+ function getAll() {
155
+ return _getAll.apply(this, arguments);
156
+ }
157
+ return getAll;
158
+ }()
159
+ /**
160
+ * Get the full metadata object (for advanced use cases)
161
+ * @returns {Promise<Object>} Full metadata object with version, components, timestamp
162
+ */
163
+ )
164
+ }, {
165
+ key: "getMetadata",
166
+ value: (function () {
167
+ var _getMetadata = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee3() {
168
+ var metadata, validated, _t2;
169
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context3) {
170
+ while (1) switch (_context3.n) {
171
+ case 0:
172
+ if (!this._isMemoryCacheValid()) {
173
+ _context3.n = 1;
174
+ break;
175
+ }
176
+ return _context3.a(2, _rollupPluginBabelHelpers.objectSpread2({}, this._memoryCache));
177
+ case 1:
178
+ _context3.p = 1;
179
+ _context3.n = 2;
180
+ return S3CacheService.getCachedJsonData(CACHE_KEY);
181
+ case 2:
182
+ metadata = _context3.v;
183
+ validated = this._validateMetadata(metadata);
184
+ this._memoryCache = validated;
185
+ this._memoryCacheTime = Date.now();
186
+ return _context3.a(2, _rollupPluginBabelHelpers.objectSpread2({}, validated));
187
+ case 3:
188
+ _context3.p = 3;
189
+ _t2 = _context3.v;
190
+ console.warn('⚠️ S3MetadataCacheService: Failed to get metadata:', _t2);
191
+ return _context3.a(2, this._createEmptyMetadata());
192
+ }
193
+ }, _callee3, this, [[1, 3]]);
194
+ }));
195
+ function getMetadata() {
196
+ return _getMetadata.apply(this, arguments);
197
+ }
198
+ return getMetadata;
199
+ }()
200
+ /**
201
+ * Add or update a component in the cache
202
+ * Uses mutex to prevent race conditions
203
+ * @param {Object} component - Component metadata to add/update
204
+ * @returns {Promise<boolean>} Success status
205
+ */
206
+ )
207
+ }, {
208
+ key: "addComponent",
209
+ value: (function () {
210
+ var _addComponent = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee4(component) {
211
+ var metadata, validated, existingIndex, _t3;
212
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context4) {
213
+ while (1) switch (_context4.n) {
214
+ case 0:
215
+ if (!(!component || !component.id && !component.uuid)) {
216
+ _context4.n = 1;
217
+ break;
218
+ }
219
+ console.warn('⚠️ S3MetadataCacheService: Cannot add component without id or uuid');
220
+ return _context4.a(2, false);
221
+ case 1:
222
+ _context4.n = 2;
223
+ return this._mutex.acquire();
224
+ case 2:
225
+ _context4.p = 2;
226
+ _context4.n = 3;
227
+ return S3CacheService.getCachedJsonData(CACHE_KEY);
228
+ case 3:
229
+ metadata = _context4.v;
230
+ validated = this._validateMetadata(metadata); // Remove existing entry if it exists (by id or uuid)
231
+ existingIndex = validated.components.findIndex(function (c) {
232
+ return c.id === component.id || c.uuid === component.uuid || component.id && c.uuid === component.id || component.uuid && c.id === component.uuid;
233
+ });
234
+ if (existingIndex !== -1) {
235
+ validated.components.splice(existingIndex, 1);
236
+ }
237
+
238
+ // Add new component
239
+ validated.components.push(component);
240
+ validated.timestamp = Date.now();
241
+
242
+ // Write back to cache
243
+ _context4.n = 4;
244
+ return S3CacheService.cacheJsonData(CACHE_KEY, validated);
245
+ case 4:
246
+ // Update memory cache
247
+ this._memoryCache = validated;
248
+ this._memoryCacheTime = Date.now();
249
+ console.log("\uD83D\uDCBE S3MetadataCacheService: Added/updated component ".concat(component.name || component.id));
250
+ return _context4.a(2, true);
251
+ case 5:
252
+ _context4.p = 5;
253
+ _t3 = _context4.v;
254
+ console.error('❌ S3MetadataCacheService: Failed to add component:', _t3);
255
+ return _context4.a(2, false);
256
+ case 6:
257
+ _context4.p = 6;
258
+ this._mutex.release();
259
+ return _context4.f(6);
260
+ case 7:
261
+ return _context4.a(2);
262
+ }
263
+ }, _callee4, this, [[2, 5, 6, 7]]);
264
+ }));
265
+ function addComponent(_x) {
266
+ return _addComponent.apply(this, arguments);
267
+ }
268
+ return addComponent;
269
+ }()
270
+ /**
271
+ * Remove a component from the cache
272
+ * Uses mutex to prevent race conditions
273
+ * @param {string} identifier - Component id or uuid to remove
274
+ * @returns {Promise<boolean>} Success status
275
+ */
276
+ )
277
+ }, {
278
+ key: "removeComponent",
279
+ value: (function () {
280
+ var _removeComponent = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee5(identifier) {
281
+ var metadata, validated, originalLength, removed, _t4;
282
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context5) {
283
+ while (1) switch (_context5.n) {
284
+ case 0:
285
+ if (identifier) {
286
+ _context5.n = 1;
287
+ break;
288
+ }
289
+ console.warn('⚠️ S3MetadataCacheService: Cannot remove component without identifier');
290
+ return _context5.a(2, false);
291
+ case 1:
292
+ _context5.n = 2;
293
+ return this._mutex.acquire();
294
+ case 2:
295
+ _context5.p = 2;
296
+ _context5.n = 3;
297
+ return S3CacheService.getCachedJsonData(CACHE_KEY);
298
+ case 3:
299
+ metadata = _context5.v;
300
+ if (!(!metadata || !metadata.components)) {
301
+ _context5.n = 4;
302
+ break;
303
+ }
304
+ console.log('ℹ️ S3MetadataCacheService: No metadata to remove from');
305
+ return _context5.a(2, true);
306
+ case 4:
307
+ validated = this._validateMetadata(metadata);
308
+ originalLength = validated.components.length; // Filter out the component by both id and uuid
309
+ validated.components = validated.components.filter(function (c) {
310
+ return c.id !== identifier && c.uuid !== identifier;
311
+ });
312
+ removed = originalLength !== validated.components.length;
313
+ if (!removed) {
314
+ _context5.n = 6;
315
+ break;
316
+ }
317
+ validated.timestamp = Date.now();
318
+ _context5.n = 5;
319
+ return S3CacheService.cacheJsonData(CACHE_KEY, validated);
320
+ case 5:
321
+ // Update memory cache
322
+ this._memoryCache = validated;
323
+ this._memoryCacheTime = Date.now();
324
+ console.log("\uD83D\uDDD1\uFE0F S3MetadataCacheService: Removed component ".concat(identifier));
325
+ case 6:
326
+ return _context5.a(2, true);
327
+ case 7:
328
+ _context5.p = 7;
329
+ _t4 = _context5.v;
330
+ console.error('❌ S3MetadataCacheService: Failed to remove component:', _t4);
331
+ return _context5.a(2, false);
332
+ case 8:
333
+ _context5.p = 8;
334
+ this._mutex.release();
335
+ return _context5.f(8);
336
+ case 9:
337
+ return _context5.a(2);
338
+ }
339
+ }, _callee5, this, [[2, 7, 8, 9]]);
340
+ }));
341
+ function removeComponent(_x2) {
342
+ return _removeComponent.apply(this, arguments);
343
+ }
344
+ return removeComponent;
345
+ }()
346
+ /**
347
+ * Clear all cached metadata
348
+ * @returns {Promise<boolean>} Success status
349
+ */
350
+ )
351
+ }, {
352
+ key: "clear",
353
+ value: (function () {
354
+ var _clear = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee6() {
355
+ var _t5;
356
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context6) {
357
+ while (1) switch (_context6.n) {
358
+ case 0:
359
+ _context6.n = 1;
360
+ return this._mutex.acquire();
361
+ case 1:
362
+ _context6.p = 1;
363
+ _context6.n = 2;
364
+ return S3CacheService.removeCachedJsonData(CACHE_KEY);
365
+ case 2:
366
+ this._invalidateMemoryCache();
367
+ console.log('🗑️ S3MetadataCacheService: Cleared all metadata');
368
+ return _context6.a(2, true);
369
+ case 3:
370
+ _context6.p = 3;
371
+ _t5 = _context6.v;
372
+ console.error('❌ S3MetadataCacheService: Failed to clear metadata:', _t5);
373
+ return _context6.a(2, false);
374
+ case 4:
375
+ _context6.p = 4;
376
+ this._mutex.release();
377
+ return _context6.f(4);
378
+ case 5:
379
+ return _context6.a(2);
380
+ }
381
+ }, _callee6, this, [[1, 3, 4, 5]]);
382
+ }));
383
+ function clear() {
384
+ return _clear.apply(this, arguments);
385
+ }
386
+ return clear;
387
+ }()
388
+ /**
389
+ * Check if a component exists in the cache
390
+ * @param {string} identifier - Component id or uuid
391
+ * @returns {Promise<boolean>} True if exists
392
+ */
393
+ )
394
+ }, {
395
+ key: "hasComponent",
396
+ value: (function () {
397
+ var _hasComponent = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee7(identifier) {
398
+ var components;
399
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context7) {
400
+ while (1) switch (_context7.n) {
401
+ case 0:
402
+ _context7.n = 1;
403
+ return this.getAll();
404
+ case 1:
405
+ components = _context7.v;
406
+ return _context7.a(2, components.some(function (c) {
407
+ return c.id === identifier || c.uuid === identifier;
408
+ }));
409
+ }
410
+ }, _callee7, this);
411
+ }));
412
+ function hasComponent(_x3) {
413
+ return _hasComponent.apply(this, arguments);
414
+ }
415
+ return hasComponent;
416
+ }()
417
+ /**
418
+ * Force refresh from persistent cache (bypass memory cache)
419
+ * @returns {Promise<Array>} Array of cached components
420
+ */
421
+ )
422
+ }, {
423
+ key: "refresh",
424
+ value: (function () {
425
+ var _refresh = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee8() {
426
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context8) {
427
+ while (1) switch (_context8.n) {
428
+ case 0:
429
+ this._invalidateMemoryCache();
430
+ return _context8.a(2, this.getAll());
431
+ }
432
+ }, _callee8, this);
433
+ }));
434
+ function refresh() {
435
+ return _refresh.apply(this, arguments);
436
+ }
437
+ return refresh;
438
+ }()
439
+ /**
440
+ * Replace all cached components with a new array
441
+ * Used for bulk operations like initial fetch
442
+ * @param {Array} components - Array of components to cache
443
+ * @returns {Promise<boolean>} Success status
444
+ */
445
+ )
446
+ }, {
447
+ key: "setAll",
448
+ value: (function () {
449
+ var _setAll = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee9(components) {
450
+ var metadata, _t6;
451
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context9) {
452
+ while (1) switch (_context9.n) {
453
+ case 0:
454
+ if (Array.isArray(components)) {
455
+ _context9.n = 1;
456
+ break;
457
+ }
458
+ console.warn('⚠️ S3MetadataCacheService: setAll requires an array');
459
+ return _context9.a(2, false);
460
+ case 1:
461
+ _context9.n = 2;
462
+ return this._mutex.acquire();
463
+ case 2:
464
+ _context9.p = 2;
465
+ metadata = {
466
+ version: CACHE_VERSION,
467
+ components: components,
468
+ timestamp: Date.now()
469
+ };
470
+ _context9.n = 3;
471
+ return S3CacheService.cacheJsonData(CACHE_KEY, metadata);
472
+ case 3:
473
+ // Update memory cache
474
+ this._memoryCache = metadata;
475
+ this._memoryCacheTime = Date.now();
476
+ console.log("\uD83D\uDCBE S3MetadataCacheService: Set ".concat(components.length, " components"));
477
+ return _context9.a(2, true);
478
+ case 4:
479
+ _context9.p = 4;
480
+ _t6 = _context9.v;
481
+ console.error('❌ S3MetadataCacheService: Failed to set components:', _t6);
482
+ return _context9.a(2, false);
483
+ case 5:
484
+ _context9.p = 5;
485
+ this._mutex.release();
486
+ return _context9.f(5);
487
+ case 6:
488
+ return _context9.a(2);
489
+ }
490
+ }, _callee9, this, [[2, 4, 5, 6]]);
491
+ }));
492
+ function setAll(_x4) {
493
+ return _setAll.apply(this, arguments);
494
+ }
495
+ return setAll;
496
+ }())
497
+ }]);
498
+ }(); // Export singleton instance
499
+ var s3MetadataCache = new S3MetadataCacheService();
500
+
501
+ exports.S3MetadataCacheService = S3MetadataCacheService;
502
+ exports.s3MetadataCache = s3MetadataCache;
@@ -0,0 +1,107 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var _rollupPluginBabelHelpers = require('../../../_virtual/_rollupPluginBabelHelpers.js');
6
+ var awsAmplify = require('aws-amplify');
7
+
8
+ /**
9
+ * Measure S3 operation time and log results
10
+ * @param {string} operation - Operation name (e.g., "Upload GLB", "Download JSON")
11
+ * @param {Function} asyncFn - Async function to measure
12
+ * @param {number} fileSize - Optional file size in bytes for speed calculation
13
+ * @returns {Promise} - Result from asyncFn
14
+ */
15
+ function measureS3Transfer(_x, _x2) {
16
+ return _measureS3Transfer.apply(this, arguments);
17
+ }
18
+ function _measureS3Transfer() {
19
+ _measureS3Transfer = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee2(operation, asyncFn) {
20
+ var fileSize,
21
+ startTime,
22
+ executeTransfer,
23
+ endTime,
24
+ duration,
25
+ _args2 = arguments,
26
+ _t,
27
+ _t2;
28
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context2) {
29
+ while (1) switch (_context2.n) {
30
+ case 0:
31
+ fileSize = _args2.length > 2 && _args2[2] !== undefined ? _args2[2] : null;
32
+ startTime = performance.now();
33
+ executeTransfer = /*#__PURE__*/function () {
34
+ var _ref = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee() {
35
+ var result, endTime, duration, logMessage, sizeMB, speedMBps;
36
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context) {
37
+ while (1) switch (_context.n) {
38
+ case 0:
39
+ _context.n = 1;
40
+ return asyncFn();
41
+ case 1:
42
+ result = _context.v;
43
+ endTime = performance.now();
44
+ duration = ((endTime - startTime) / 1000).toFixed(3); // Convert to seconds
45
+ logMessage = "\u23F1\uFE0F S3 ".concat(operation, ": ").concat(duration, "s");
46
+ if (fileSize) {
47
+ sizeMB = (fileSize / (1024 * 1024)).toFixed(2);
48
+ speedMBps = (sizeMB / duration).toFixed(2);
49
+ logMessage += " (".concat(sizeMB, " MB @ ").concat(speedMBps, " MB/s)");
50
+ }
51
+ console.log(logMessage);
52
+ return _context.a(2, result);
53
+ }
54
+ }, _callee);
55
+ }));
56
+ return function executeTransfer() {
57
+ return _ref.apply(this, arguments);
58
+ };
59
+ }();
60
+ _context2.p = 1;
61
+ _context2.n = 2;
62
+ return executeTransfer();
63
+ case 2:
64
+ return _context2.a(2, _context2.v);
65
+ case 3:
66
+ _context2.p = 3;
67
+ _t = _context2.v;
68
+ if (!(_t.code === 'ExpiredToken' || _t.message && _t.message.includes('ExpiredToken'))) {
69
+ _context2.n = 8;
70
+ break;
71
+ }
72
+ console.warn("\u26A0\uFE0F Token expired during ".concat(operation, ". Attempting session refresh and retry..."));
73
+ _context2.p = 4;
74
+ _context2.n = 5;
75
+ return awsAmplify.Auth.currentCredentials({
76
+ bypassCache: true
77
+ });
78
+ case 5:
79
+ console.log("\u2705 Session refreshed. Retrying ".concat(operation, "..."));
80
+
81
+ // Reset timer for the retry
82
+ startTime = performance.now();
83
+ _context2.n = 6;
84
+ return executeTransfer();
85
+ case 6:
86
+ return _context2.a(2, _context2.v);
87
+ case 7:
88
+ _context2.p = 7;
89
+ _t2 = _context2.v;
90
+ console.error("\u274C Retry failed for ".concat(operation, ":"), _t2);
91
+ // If retry fails, throw the Retry Error (likely unrelated or persistent auth issue)
92
+ throw _t2;
93
+ case 8:
94
+ // Standard error handling for non-expired tokens (or if logic above didn't catch it)
95
+ endTime = performance.now();
96
+ duration = ((endTime - startTime) / 1000).toFixed(3);
97
+ console.error("\u274C S3 ".concat(operation, " failed after ").concat(duration, "s:"), _t);
98
+ throw _t;
99
+ case 9:
100
+ return _context2.a(2);
101
+ }
102
+ }, _callee2, null, [[4, 7], [1, 3]]);
103
+ }));
104
+ return _measureS3Transfer.apply(this, arguments);
105
+ }
106
+
107
+ exports.measureS3Transfer = measureS3Transfer;
@@ -31,7 +31,7 @@ var CentralPlant = /*#__PURE__*/function (_BaseDisposable) {
31
31
  * Initialize the CentralPlant manager
32
32
  *
33
33
  * @constructor
34
- * @version 0.2.12
34
+ * @version 0.3.0
35
35
  * @updated 2025-10-22
36
36
  *
37
37
  * @description Creates a new CentralPlant instance and initializes internal managers and utilities.
@@ -25,7 +25,10 @@ export { loadTextureSetAndCreateMaterial } from './managers/environment/textureC
25
25
  export { ThreeJSResourceManager } from './managers/system/threeJSResourceManager.js';
26
26
  export { PerformanceMonitorManager } from './managers/system/performanceMonitorManager.js';
27
27
  export { OperationHistoryManager } from './managers/system/operationHistoryManager.js';
28
- export { CACHE_EXPIRY, CACHE_NAME_PREFIX, CacheManager, cacheManager } from './managers/CacheManager.js';
28
+ export { CACHE_EXPIRY, CACHE_NAME_PREFIX, CacheManager, cacheManager } from './managers/cache/CacheManager.js';
29
+ export { GLOBAL_CACHE_NAME, cacheJsonData, cleanExpiredCache, cleanInvalidCacheEntries, clearS3Cache, formatCacheExpiry, getAllCacheKeys, getCacheExpiryForPath, getCacheStats, getCachedJsonData, getCachedLocalFile, getCachedLocalFileURL, getCachedLocalJson, getCachedS3Json, getCachedS3Object, getCachedS3ObjectURL, getCurrentCacheName, getGlobalCacheStats, getGlobalOnlyCacheStats, getThumbnailKey, getUserOnlyCacheStats, isCached, isThumbnailCached, preloadLocalFiles, preloadS3Objects, removeCachedJsonData, resetCacheIdentity, resetGlobalCacheStats, switchCachePartition } from './managers/cache/S3CacheService.js';
30
+ export { S3MetadataCacheService, s3MetadataCache } from './managers/cache/S3MetadataCacheService.js';
31
+ export { measureS3Transfer } from './managers/cache/s3Timing.js';
29
32
  export { ModelManager } from './managers/scene/modelManager.js';
30
33
  export { default as modelPreloader } from './rendering/modelPreloader.js';
31
34
  import * as rendering2D from './rendering/rendering2D.js';