实现快传,完善快传和网盘的功能,实现文件的互传等一系列功能

This commit is contained in:
yoyuzh
2026-03-20 14:16:18 +08:00
parent 944ab6dbf8
commit 43358e29d7
109 changed files with 5237 additions and 2465 deletions

View File

@@ -0,0 +1,122 @@
import assert from 'node:assert/strict';
import test from 'node:test';
import {
createTransferFileManifest,
createTransferCompleteMessage,
createTransferFileCompleteMessage,
createTransferFileId,
createTransferFileManifestMessage,
createTransferFileMetaMessage,
createTransferReceiveRequestMessage,
parseTransferControlMessage,
toTransferChunk,
} from './transfer-protocol';
test('createTransferFileId uses stable file identity parts', () => {
assert.equal(
createTransferFileId({
name: 'report.pdf',
lastModified: 1730000000000,
size: 2048,
}),
'report.pdf-1730000000000-2048',
);
});
test('createTransferFileMetaMessage encodes the control payload for sender and receiver', () => {
const payload = parseTransferControlMessage(
createTransferFileMetaMessage({
id: 'report-1',
name: 'report.pdf',
size: 2048,
contentType: 'application/pdf',
relativePath: '课程资料/report.pdf',
}),
);
assert.deepEqual(payload, {
type: 'file-meta',
id: 'report-1',
name: 'report.pdf',
size: 2048,
contentType: 'application/pdf',
relativePath: '课程资料/report.pdf',
});
});
test('createTransferFileManifest keeps folder relative paths from selected files', () => {
const report = new File(['report'], 'report.pdf', {
type: 'application/pdf',
lastModified: 1730000000000,
});
Object.defineProperty(report, 'webkitRelativePath', {
configurable: true,
value: '课程资料/report.pdf',
});
const manifest = createTransferFileManifest([report]);
assert.deepEqual(manifest, [
{
id: 'report.pdf-1730000000000-6',
name: 'report.pdf',
size: 6,
contentType: 'application/pdf',
relativePath: '课程资料/report.pdf',
},
]);
});
test('createTransferFileManifestMessage and createTransferReceiveRequestMessage stay parseable', () => {
const manifestPayload = parseTransferControlMessage(
createTransferFileManifestMessage([
{
id: 'report-1',
name: 'report.pdf',
size: 2048,
contentType: 'application/pdf',
relativePath: '课程资料/report.pdf',
},
]),
);
assert.deepEqual(manifestPayload, {
type: 'manifest',
files: [
{
id: 'report-1',
name: 'report.pdf',
size: 2048,
contentType: 'application/pdf',
relativePath: '课程资料/report.pdf',
},
],
});
assert.deepEqual(parseTransferControlMessage(createTransferReceiveRequestMessage(['report-1'], true)), {
type: 'receive-request',
fileIds: ['report-1'],
archive: true,
});
});
test('createTransferFileCompleteMessage and createTransferCompleteMessage create parseable control messages', () => {
assert.deepEqual(parseTransferControlMessage(createTransferFileCompleteMessage('report-1')), {
type: 'file-complete',
id: 'report-1',
});
assert.deepEqual(parseTransferControlMessage(createTransferCompleteMessage()), {
type: 'transfer-complete',
});
});
test('parseTransferControlMessage returns null for invalid payloads', () => {
assert.equal(parseTransferControlMessage('{not-json'), null);
});
test('toTransferChunk normalizes ArrayBuffer and Blob data into bytes', async () => {
assert.deepEqual(Array.from(await toTransferChunk(new Uint8Array([1, 2, 3]).buffer)), [1, 2, 3]);
assert.deepEqual(Array.from(await toTransferChunk(new Blob(['hi']))), [104, 105]);
});