91 lines
3.3 KiB
JavaScript
91 lines
3.3 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import { EnhancedSecureFileTransfer } from '../src/transfer/EnhancedSecureFileTransfer.js';
|
|
|
|
function createSystem() {
|
|
const manager = {
|
|
dataChannel: { onmessage: null, send() {}, readyState: 'open' },
|
|
isVerified: true,
|
|
fileTransferSystem: null,
|
|
isConnected: () => true
|
|
};
|
|
return new EnhancedSecureFileTransfer(manager);
|
|
}
|
|
|
|
// cleanupTransfer rejects pending sender consent immediately and clears its timeout.
|
|
{
|
|
const system = createSystem();
|
|
let rejectionMessage = null;
|
|
const timer = setTimeout(() => {}, 10_000);
|
|
system.activeTransfers.set('file_waiting', {
|
|
consentTimeout: timer,
|
|
rejectConsent(error) { rejectionMessage = error.message; },
|
|
resolveConsent() {}
|
|
});
|
|
system.sessionKeys.set('file_waiting', {});
|
|
system.transferNonces.set('file_waiting', 1);
|
|
|
|
system.cleanupTransfer('file_waiting');
|
|
|
|
assert.equal(system.activeTransfers.has('file_waiting'), false);
|
|
assert.equal(system.sessionKeys.has('file_waiting'), false);
|
|
assert.equal(system.transferNonces.has('file_waiting'), false);
|
|
assert.equal(rejectionMessage, 'Transfer cancelled during cleanup or disconnect');
|
|
assert.equal(system.activeTransfers.size, 0);
|
|
}
|
|
|
|
// global cleanup does not leave pending consent promises alive until timeout.
|
|
{
|
|
const system = createSystem();
|
|
let rejected = false;
|
|
const timer = setTimeout(() => {}, 10_000);
|
|
system.activeTransfers.set('file_waiting', {
|
|
consentTimeout: timer,
|
|
rejectConsent() { rejected = true; },
|
|
resolveConsent() {}
|
|
});
|
|
system.cleanup();
|
|
assert.equal(rejected, true);
|
|
assert.equal(system.activeTransfers.size, 0);
|
|
}
|
|
|
|
// receivedFileBuffers is bounded and evicts the oldest retained buffer.
|
|
{
|
|
const system = createSystem();
|
|
system.MAX_RETAINED_RECEIVED_FILE_BUFFERS = 2;
|
|
system._storeReceivedFileBuffer('a', { buffer: new Uint8Array([1]).buffer });
|
|
system._storeReceivedFileBuffer('b', { buffer: new Uint8Array([2]).buffer });
|
|
system._storeReceivedFileBuffer('c', { buffer: new Uint8Array([3]).buffer });
|
|
assert.equal(system.receivedFileBuffers.size, 2);
|
|
assert.equal(system.receivedFileBuffers.has('a'), false);
|
|
assert.equal(system.receivedFileBuffers.has('b'), true);
|
|
assert.equal(system.receivedFileBuffers.has('c'), true);
|
|
}
|
|
|
|
// Evicted received buffers fail gracefully for old download closures.
|
|
{
|
|
const system = createSystem();
|
|
system.MAX_RETAINED_RECEIVED_FILE_BUFFERS = 1;
|
|
let fileData = null;
|
|
system.onFileReceived = data => { fileData = data; };
|
|
system.calculateFileHashFromData = async () => 'hash';
|
|
system.sendSecureMessage = async () => {};
|
|
const receivingState = {
|
|
fileId: 'old',
|
|
fileName: 'old.pdf',
|
|
fileSize: 1,
|
|
fileType: 'application/pdf',
|
|
fileHash: 'hash',
|
|
totalChunks: 1,
|
|
receivedChunks: new Map([[0, new Uint8Array([1]).buffer]]),
|
|
startTime: Date.now()
|
|
};
|
|
await system.assembleFile(receivingState);
|
|
system._storeReceivedFileBuffer('new', { buffer: new Uint8Array([2]).buffer });
|
|
await assert.rejects(
|
|
() => fileData.getObjectURL(),
|
|
/no longer available for download/i
|
|
);
|
|
}
|
|
|
|
console.log('File transfer cleanup tests passed');
|