@hkdigital/lib-sveltekit 0.1.101 → 0.1.103
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.
@@ -347,6 +347,16 @@ export default class IndexedDbCache {
|
|
347
347
|
return;
|
348
348
|
}
|
349
349
|
|
350
|
+
// Clone Blob before reference becomes invalid
|
351
|
+
let responseBody = entry.body;
|
352
|
+
|
353
|
+
if (entry.bodyType === 'arrayBuffer') {
|
354
|
+
// Reconstruct Blob from ArrayBuffer
|
355
|
+
responseBody = new Blob([entry.body], {
|
356
|
+
type: entry.contentType || 'application/octet-stream'
|
357
|
+
});
|
358
|
+
}
|
359
|
+
|
350
360
|
// Check if expired
|
351
361
|
if (entry.expires && Date.now() > entry.expires) {
|
352
362
|
// Delete expired entry (but don't block)
|
@@ -357,7 +367,7 @@ export default class IndexedDbCache {
|
|
357
367
|
return;
|
358
368
|
}
|
359
369
|
|
360
|
-
// Update access timestamp
|
370
|
+
// Update access timestamp
|
361
371
|
await this._updateAccessTime(key).catch((err) => {
|
362
372
|
console.error('Failed to update access time:', err);
|
363
373
|
});
|
@@ -387,13 +397,6 @@ export default class IndexedDbCache {
|
|
387
397
|
try {
|
388
398
|
let responseHeaders = new Headers(entry.headers);
|
389
399
|
|
390
|
-
let responseBody = entry.body;
|
391
|
-
|
392
|
-
if (responseBody instanceof Blob) {
|
393
|
-
// Clone the blob to ensure it's not consumed
|
394
|
-
responseBody = entry.body.slice(0, entry.body.size, entry.body.type);
|
395
|
-
}
|
396
|
-
|
397
400
|
// Create Response safely
|
398
401
|
let response;
|
399
402
|
try {
|
@@ -459,7 +462,6 @@ export default class IndexedDbCache {
|
|
459
462
|
try {
|
460
463
|
// Postpone cleanup when storing items
|
461
464
|
this._postponeCleanup();
|
462
|
-
|
463
465
|
const db = await this.dbPromise;
|
464
466
|
|
465
467
|
// Clone the response to avoid consuming it
|
@@ -467,27 +469,39 @@ export default class IndexedDbCache {
|
|
467
469
|
|
468
470
|
// Extract response data - handle both browser Response and test mocks
|
469
471
|
let body;
|
472
|
+
let bodyType = 'arrayBuffer'; // Default to arrayBuffer
|
473
|
+
let contentType = '';
|
474
|
+
|
470
475
|
try {
|
476
|
+
contentType = clonedResponse.headers.get('content-type') || '';
|
477
|
+
|
471
478
|
// Try standard Response.blob() first (browser environment)
|
472
|
-
|
479
|
+
const blob = await clonedResponse.blob();
|
480
|
+
|
481
|
+
// Convert to ArrayBuffer
|
482
|
+
body = await blob.arrayBuffer();
|
483
|
+
|
473
484
|
} catch (err) {
|
474
485
|
// Fallback for test environment
|
475
|
-
if (
|
476
|
-
|
486
|
+
if (typeof clonedResponse.body === 'string') {
|
487
|
+
const blob = new Blob([clonedResponse.body]);
|
488
|
+
body = await blob.arrayBuffer();
|
489
|
+
} else if (
|
477
490
|
clonedResponse.body instanceof ArrayBuffer ||
|
478
491
|
clonedResponse.body instanceof Uint8Array
|
479
492
|
) {
|
480
|
-
|
493
|
+
// Already have array-like data
|
494
|
+
body = clonedResponse.body instanceof ArrayBuffer ?
|
495
|
+
clonedResponse.body :
|
496
|
+
clonedResponse.body.buffer;
|
481
497
|
} else {
|
482
|
-
// Last resort -
|
483
|
-
body =
|
498
|
+
// Last resort - create empty ArrayBuffer
|
499
|
+
body = new ArrayBuffer(0);
|
484
500
|
}
|
485
501
|
}
|
486
502
|
|
487
503
|
// Extract headers
|
488
|
-
|
489
504
|
let headers = [];
|
490
|
-
|
491
505
|
try {
|
492
506
|
headers = Array.from(clonedResponse.headers.entries());
|
493
507
|
} catch (err) {
|
@@ -496,21 +510,9 @@ export default class IndexedDbCache {
|
|
496
510
|
headers = [];
|
497
511
|
}
|
498
512
|
|
499
|
-
// let headers = [];
|
500
|
-
// try {
|
501
|
-
// headers = Array.from(clonedResponse.headers.entries());
|
502
|
-
// } catch (err) {
|
503
|
-
// // Fallback for test environment - extract headers if available
|
504
|
-
// if (clonedResponse._headers &&
|
505
|
-
// typeof clonedResponse._headers.entries === 'function') {
|
506
|
-
// headers = Array.from(clonedResponse._headers.entries());
|
507
|
-
// }
|
508
|
-
// }
|
509
|
-
|
510
513
|
// Calculate rough size estimate
|
511
514
|
const headerSize = JSON.stringify(headers).length * 2;
|
512
|
-
const size =
|
513
|
-
/** @type {Blob} */ (body.size || 0) + headerSize + key.length * 2;
|
515
|
+
const size = body.byteLength + headerSize + key.length * 2;
|
514
516
|
|
515
517
|
const entry = {
|
516
518
|
key,
|
@@ -519,6 +521,8 @@ export default class IndexedDbCache {
|
|
519
521
|
statusText: clonedResponse.statusText || '',
|
520
522
|
headers,
|
521
523
|
body,
|
524
|
+
bodyType,
|
525
|
+
contentType,
|
522
526
|
metadata,
|
523
527
|
timestamp: Date.now(),
|
524
528
|
lastAccessed: Date.now(),
|