@storacha/encrypt-upload-client 1.1.65 → 1.1.67

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 (53) hide show
  1. package/README.md +1 -1
  2. package/dist/config/constants.d.ts +1 -1
  3. package/dist/config/constants.d.ts.map +1 -1
  4. package/dist/config/constants.js +2 -2
  5. package/dist/config/env.d.ts +0 -1
  6. package/dist/config/env.d.ts.map +1 -1
  7. package/dist/config/env.js +0 -7
  8. package/dist/core/client.js +1 -1
  9. package/dist/crypto/adapters/lit-crypto-adapter.d.ts +35 -4
  10. package/dist/crypto/adapters/lit-crypto-adapter.d.ts.map +1 -1
  11. package/dist/crypto/adapters/lit-crypto-adapter.js +38 -41
  12. package/dist/crypto/factories.node.d.ts +4 -10
  13. package/dist/crypto/factories.node.d.ts.map +1 -1
  14. package/dist/crypto/factories.node.js +6 -16
  15. package/dist/protocols/lit.d.ts +13 -18
  16. package/dist/protocols/lit.d.ts.map +1 -1
  17. package/dist/protocols/lit.js +67 -88
  18. package/dist/types.d.ts +24 -15
  19. package/dist/types.d.ts.map +1 -1
  20. package/dist/utils/file-metadata.d.ts.map +1 -1
  21. package/dist/utils/file-metadata.js +39 -14
  22. package/package.json +12 -11
  23. package/dist/test/cid-verification.spec.d.ts +0 -2
  24. package/dist/test/cid-verification.spec.d.ts.map +0 -1
  25. package/dist/test/cid-verification.spec.js +0 -314
  26. package/dist/test/crypto-compatibility.spec.d.ts +0 -2
  27. package/dist/test/crypto-compatibility.spec.d.ts.map +0 -1
  28. package/dist/test/crypto-compatibility.spec.js +0 -124
  29. package/dist/test/crypto-counter-security.spec.d.ts +0 -2
  30. package/dist/test/crypto-counter-security.spec.d.ts.map +0 -1
  31. package/dist/test/crypto-counter-security.spec.js +0 -147
  32. package/dist/test/crypto-streaming.spec.d.ts +0 -2
  33. package/dist/test/crypto-streaming.spec.d.ts.map +0 -1
  34. package/dist/test/crypto-streaming.spec.js +0 -129
  35. package/dist/test/crypto-streaming.spec.js.map +0 -1
  36. package/dist/test/encrypted-metadata.spec.d.ts +0 -2
  37. package/dist/test/encrypted-metadata.spec.d.ts.map +0 -1
  38. package/dist/test/encrypted-metadata.spec.js +0 -68
  39. package/dist/test/encrypted-metadata.spec.js.map +0 -1
  40. package/dist/test/factories.spec.d.ts +0 -2
  41. package/dist/test/factories.spec.d.ts.map +0 -1
  42. package/dist/test/factories.spec.js +0 -142
  43. package/dist/test/factories.spec.js.map +0 -1
  44. package/dist/test/file-metadata.spec.d.ts +0 -2
  45. package/dist/test/file-metadata.spec.d.ts.map +0 -1
  46. package/dist/test/file-metadata.spec.js +0 -433
  47. package/dist/test/file-metadata.spec.js.map +0 -1
  48. package/dist/test/helpers/test-file-utils.d.ts +0 -60
  49. package/dist/test/helpers/test-file-utils.d.ts.map +0 -1
  50. package/dist/test/helpers/test-file-utils.js +0 -139
  51. package/dist/test/setup.d.ts +0 -2
  52. package/dist/test/setup.d.ts.map +0 -1
  53. package/dist/test/setup.js +0 -12
@@ -1,142 +0,0 @@
1
- import './setup.js';
2
- import { test, describe } from 'node:test';
3
- import assert from 'node:assert';
4
- import { createGenericKMSAdapter, createGenericLitAdapter, createNodeLitAdapter, } from '../src/crypto/factories.node.js';
5
- import { GenericAesCtrStreamingCrypto } from '../src/crypto/symmetric/generic-aes-ctr-streaming-crypto.js';
6
- import { NodeAesCbcCrypto } from '../src/crypto/symmetric/node-aes-cbc-crypto.js';
7
- import { LitCryptoAdapter } from '../src/crypto/adapters/lit-crypto-adapter.js';
8
- import { KMSCryptoAdapter } from '../src/crypto/adapters/kms-crypto-adapter.js';
9
- // Mock Lit client for testing
10
- const mockLitClient = /** @type {any} */ ({
11
- connect: () => Promise.resolve(),
12
- disconnect: () => Promise.resolve(),
13
- });
14
- await describe('Crypto Factory Functions', async () => {
15
- await describe('createBrowserLitAdapter', async () => {
16
- await test('should create LitCryptoAdapter with streaming crypto', async () => {
17
- const adapter = createGenericLitAdapter(mockLitClient);
18
- // Verify adapter type
19
- assert(adapter instanceof LitCryptoAdapter, 'Should create LitCryptoAdapter instance');
20
- // Verify symmetric crypto implementation
21
- assert(adapter.symmetricCrypto instanceof GenericAesCtrStreamingCrypto, 'Should use GenericAesCtrStreamingCrypto for browser environment');
22
- // Verify lit client is passed through
23
- assert.strictEqual(adapter.litClient, mockLitClient, 'Should pass through the lit client');
24
- });
25
- await test('should create adapter with required interface methods', async () => {
26
- const adapter = createGenericLitAdapter(mockLitClient);
27
- // Verify adapter has all required methods
28
- assert(typeof adapter.encryptStream === 'function', 'Should have encryptStream method');
29
- assert(typeof adapter.decryptStream === 'function', 'Should have decryptStream method');
30
- assert(typeof adapter.encryptSymmetricKey === 'function', 'Should have encryptSymmetricKey method');
31
- assert(typeof adapter.decryptSymmetricKey === 'function', 'Should have decryptSymmetricKey method');
32
- assert(typeof adapter.extractEncryptedMetadata === 'function', 'Should have extractEncryptedMetadata method');
33
- assert(typeof adapter.getEncryptedKey === 'function', 'Should have getEncryptedKey method');
34
- });
35
- await test('should handle null or undefined lit client gracefully', async () => {
36
- // This should still create the adapter (validation happens at runtime)
37
- const adapter = createGenericLitAdapter(/** @type {any} */ (null));
38
- assert(adapter instanceof LitCryptoAdapter, 'Should create adapter even with null client');
39
- });
40
- });
41
- await describe('createNodeLitAdapter', async () => {
42
- await test('should create LitCryptoAdapter with Node crypto', async () => {
43
- const adapter = createNodeLitAdapter(mockLitClient);
44
- // Verify adapter type
45
- assert(adapter instanceof LitCryptoAdapter, 'Should create LitCryptoAdapter instance');
46
- // Verify symmetric crypto implementation
47
- assert(adapter.symmetricCrypto instanceof NodeAesCbcCrypto, 'Should use NodeAesCbcCrypto for Node.js environment');
48
- // Verify lit client is passed through
49
- assert.strictEqual(adapter.litClient, mockLitClient, 'Should pass through the lit client');
50
- });
51
- });
52
- await describe('createBrowserKMSAdapter', async () => {
53
- await test('should create KMSCryptoAdapter with streaming crypto', async () => {
54
- const keyManagerServiceURL = 'https://gateway.example.com';
55
- const keyManagerServiceDID = 'did:web:gateway.example.com';
56
- const adapter = createGenericKMSAdapter(keyManagerServiceURL, keyManagerServiceDID);
57
- // Verify adapter type
58
- assert(adapter instanceof KMSCryptoAdapter, 'Should create KMSCryptoAdapter instance');
59
- // Verify symmetric crypto implementation
60
- assert(adapter.symmetricCrypto instanceof GenericAesCtrStreamingCrypto, 'Should use GenericAesCtrStreamingCrypto for browser environment');
61
- // Verify configuration is passed through
62
- assert.strictEqual(adapter.keyManagerServiceURL.toString(), keyManagerServiceURL + '/', 'Should set the key manager service URL');
63
- assert.strictEqual(adapter.keyManagerServiceDID.did(), keyManagerServiceDID, 'Should set the key manager service DID');
64
- });
65
- await test('should accept URL object for gateway URL', async () => {
66
- const keyManagerServiceURL = new URL('https://gateway.example.com');
67
- const keyManagerServiceDID = 'did:web:gateway.example.com';
68
- const adapter = createGenericKMSAdapter(keyManagerServiceURL, keyManagerServiceDID);
69
- assert(adapter instanceof KMSCryptoAdapter, 'Should create KMSCryptoAdapter with URL object');
70
- assert.strictEqual(adapter.keyManagerServiceURL.toString(), keyManagerServiceURL.toString(), 'Should handle URL object input');
71
- });
72
- await test('should enforce HTTPS for security', async () => {
73
- const httpKeyManagerServiceURL = 'http://insecure.example.com';
74
- const keyManagerServiceDID = 'did:web:example.com';
75
- assert.throws(() => createGenericKMSAdapter(httpKeyManagerServiceURL, keyManagerServiceDID), /Key manager service must use HTTPS protocol for security/, 'Should reject HTTP URLs for security');
76
- });
77
- await test('should allow HTTP with explicit insecure option', async () => {
78
- // Note: The current implementation doesn't expose options in the factory
79
- // but we can test this through direct adapter construction
80
- const httpKeyManagerServiceURL = 'http://localhost:3000';
81
- const keyManagerServiceDID = 'did:web:localhost';
82
- assert.throws(() => createGenericKMSAdapter(httpKeyManagerServiceURL, keyManagerServiceDID), /Key manager service must use HTTPS protocol for security/, 'Should reject HTTP URLs even for localhost by default');
83
- });
84
- await test('should have all required KMS adapter methods', async () => {
85
- const adapter = createGenericKMSAdapter('https://gateway.example.com', 'did:web:gateway.example.com');
86
- // Verify adapter has all required methods
87
- assert(typeof adapter.encryptStream === 'function', 'Should have encryptStream method');
88
- assert(typeof adapter.decryptStream === 'function', 'Should have decryptStream method');
89
- assert(typeof adapter.encryptSymmetricKey === 'function', 'Should have encryptSymmetricKey method');
90
- assert(typeof adapter.decryptSymmetricKey === 'function', 'Should have decryptSymmetricKey method');
91
- });
92
- });
93
- await describe('Factory Function Consistency', async () => {
94
- await test('browser factories should use streaming crypto', async () => {
95
- const litAdapter = createGenericLitAdapter(mockLitClient);
96
- const kmsAdapter = createGenericKMSAdapter('https://gateway.example.com', 'did:web:gateway.example.com');
97
- assert(litAdapter.symmetricCrypto.constructor.name ===
98
- 'GenericAesCtrStreamingCrypto', 'Browser Lit adapter should use streaming crypto');
99
- assert(kmsAdapter.symmetricCrypto.constructor.name ===
100
- 'GenericAesCtrStreamingCrypto', 'Browser KMS adapter should use streaming crypto');
101
- });
102
- await test('node factories should use Node crypto', async () => {
103
- const litAdapter = createNodeLitAdapter(mockLitClient);
104
- assert(litAdapter.symmetricCrypto.constructor.name === 'NodeAesCbcCrypto', 'Node Lit adapter should use Node crypto');
105
- });
106
- await test('all adapters should implement the same interface', async () => {
107
- const adapters = [
108
- createGenericLitAdapter(mockLitClient),
109
- createNodeLitAdapter(mockLitClient),
110
- createGenericKMSAdapter('https://gateway.example.com', 'did:web:gateway.example.com'),
111
- createGenericKMSAdapter('https://gateway.example.com', 'did:web:gateway.example.com'),
112
- ];
113
- const requiredMethods = [
114
- 'encryptStream',
115
- 'decryptStream',
116
- 'encryptSymmetricKey',
117
- 'decryptSymmetricKey',
118
- 'extractEncryptedMetadata',
119
- 'getEncryptedKey',
120
- ];
121
- for (const adapter of adapters) {
122
- for (const method of requiredMethods) {
123
- assert(typeof ( /** @type {any} */(adapter)[method]) === 'function', `${adapter.constructor.name} should have ${method} method`);
124
- }
125
- }
126
- });
127
- });
128
- await describe('Memory Usage Verification', async () => {
129
- await test('browser adapters should use memory-efficient streaming crypto', async () => {
130
- const litAdapter = createGenericLitAdapter(mockLitClient);
131
- const kmsAdapter = createGenericKMSAdapter('https://gateway.example.com', 'did:web:gateway.example.com');
132
- // Verify both use the streaming implementation
133
- assert(litAdapter.symmetricCrypto instanceof GenericAesCtrStreamingCrypto, 'Lit adapter should use streaming crypto for memory efficiency');
134
- assert(kmsAdapter.symmetricCrypto instanceof GenericAesCtrStreamingCrypto, 'KMS adapter should use streaming crypto for memory efficiency');
135
- // Verify they have the streaming characteristics
136
- const testBlob = new Blob([new Uint8Array(1024)]); // 1KB test
137
- const litResult = await litAdapter.encryptStream(testBlob);
138
- assert(litResult.encryptedStream instanceof ReadableStream, 'Should return ReadableStream for streaming');
139
- });
140
- });
141
- });
142
- //# sourceMappingURL=factories.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"factories.spec.js","sourceRoot":"","sources":["../../test/factories.spec.js"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=file-metadata.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"file-metadata.spec.d.ts","sourceRoot":"","sources":["../../test/file-metadata.spec.js"],"names":[],"mappings":""}
@@ -1,433 +0,0 @@
1
- import { describe, it } from 'node:test';
2
- import assert from 'assert';
3
- import { createFileWithMetadata, extractFileMetadata, } from '../src/utils/file-metadata.js';
4
- /**
5
- * Create a mock file for testing
6
- *
7
- * @param {string} content - The file content
8
- * @param {string} filename - The filename
9
- * @returns {Blob} Mock file blob
10
- */
11
- const createMockFile = (content = 'test file content', filename = 'test.txt') => {
12
- return new Blob([content], { type: 'text/plain' });
13
- };
14
- /**
15
- * Convert stream to array buffer for testing
16
- *
17
- * @param {ReadableStream} stream - The stream to convert
18
- * @returns {Promise<ArrayBuffer>} The converted array buffer
19
- */
20
- const streamToArrayBuffer = async (stream) => {
21
- const reader = stream.getReader();
22
- const chunks = [];
23
- let done = false;
24
- while (!done) {
25
- const result = await reader.read();
26
- done = result.done;
27
- if (!done) {
28
- chunks.push(result.value);
29
- }
30
- }
31
- const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);
32
- const result = new Uint8Array(totalLength);
33
- let offset = 0;
34
- for (const chunk of chunks) {
35
- result.set(chunk, offset);
36
- offset += chunk.length;
37
- }
38
- return result.buffer;
39
- };
40
- await describe('File Metadata Utils', async () => {
41
- await describe('createFileWithMetadata', async () => {
42
- await it('should create file without metadata', () => {
43
- const originalFile = createMockFile();
44
- const result = createFileWithMetadata(originalFile);
45
- assert(result instanceof Blob);
46
- assert.equal(result.size, originalFile.size);
47
- });
48
- await it('should create file with metadata', () => {
49
- const originalFile = createMockFile();
50
- const metadata = {
51
- name: 'test.txt',
52
- type: 'text/plain',
53
- extension: 'txt',
54
- };
55
- const result = createFileWithMetadata(originalFile, metadata);
56
- assert(result instanceof Blob);
57
- assert.equal(result.size, originalFile.size + 1024); // Original file + 1KB header
58
- });
59
- await it('should reject metadata that is too large', () => {
60
- const originalFile = createMockFile();
61
- const largeMetadata = {
62
- name: 'test.txt',
63
- type: 'text/plain',
64
- extension: 'txt',
65
- metadata: {
66
- description: 'a'.repeat(1000), // Very long description
67
- },
68
- };
69
- assert.throws(() => createFileWithMetadata(originalFile, largeMetadata), /Metadata too large/);
70
- });
71
- await it('should handle empty files', () => {
72
- const emptyFile = new Blob(['']);
73
- const metadata = {
74
- name: 'empty.txt',
75
- type: 'text/plain',
76
- extension: 'txt',
77
- };
78
- const result = createFileWithMetadata(emptyFile, metadata);
79
- assert.equal(result.size, 1024); // Just the header
80
- });
81
- await it('should handle binary files', () => {
82
- const binaryData = new Uint8Array([
83
- 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a,
84
- ]); // PNG header
85
- const binaryFile = new Blob([binaryData], { type: 'image/png' });
86
- const metadata = {
87
- name: 'image.png',
88
- type: 'image/png',
89
- extension: 'png',
90
- };
91
- const result = createFileWithMetadata(binaryFile, metadata);
92
- assert.equal(result.size, binaryData.length + 1024);
93
- });
94
- await it('should handle international characters in metadata', () => {
95
- const originalFile = createMockFile();
96
- const metadata = {
97
- name: '测试文件.txt', // Chinese characters
98
- type: 'text/plain',
99
- extension: 'txt',
100
- metadata: {
101
- author: '作者',
102
- emoji: '🎉📁',
103
- },
104
- };
105
- const result = createFileWithMetadata(originalFile, metadata);
106
- assert(result instanceof Blob);
107
- assert.equal(result.size, originalFile.size + 1024);
108
- });
109
- await it('should reject invalid metadata structure - null', () => {
110
- const originalFile = createMockFile();
111
- assert.throws(() => createFileWithMetadata(originalFile, /** @type {any} */ (null)), /Invalid metadata structure/);
112
- });
113
- await it('should reject invalid metadata structure - array', () => {
114
- const originalFile = createMockFile();
115
- assert.throws(() => createFileWithMetadata(originalFile,
116
- /** @type {any} */ (['name', 'type'])), /Invalid metadata structure/);
117
- });
118
- await it('should reject missing required fields', () => {
119
- const originalFile = createMockFile();
120
- const incompleteMetadata = { name: 'test.txt' }; // Missing type and extension
121
- assert.throws(() => createFileWithMetadata(originalFile,
122
- /** @type {any} */ (incompleteMetadata)), /Invalid metadata structure/);
123
- });
124
- await it('should reject fields that are too long', () => {
125
- const originalFile = createMockFile();
126
- const longFieldMetadata = {
127
- name: 'a'.repeat(250), // Exceeds MAX_FIELD_LENGTH
128
- type: 'text/plain',
129
- extension: 'txt',
130
- };
131
- assert.throws(() => createFileWithMetadata(originalFile, longFieldMetadata), /Metadata field too long/);
132
- });
133
- await it('should reject wrong field types', () => {
134
- const originalFile = createMockFile();
135
- const wrongTypeMetadata = {
136
- name: 123, // Should be string
137
- type: 'text/plain',
138
- extension: 'txt',
139
- };
140
- assert.throws(() => createFileWithMetadata(originalFile,
141
- /** @type {any} */ (wrongTypeMetadata)), /Invalid metadata structure/);
142
- });
143
- await it('should handle Uint8Array input without metadata', () => {
144
- const data = new Uint8Array([1, 2, 3, 4, 5]);
145
- const result = createFileWithMetadata(/** @type {any} */ (data));
146
- assert(result instanceof Blob);
147
- assert.equal(result.size, data.length);
148
- });
149
- await it('should handle Uint8Array input with metadata', () => {
150
- const data = new Uint8Array([1, 2, 3, 4, 5]);
151
- const metadata = {
152
- name: 'data.bin',
153
- type: 'application/octet-stream',
154
- extension: 'bin',
155
- };
156
- const result = createFileWithMetadata(/** @type {any} */ (data), metadata);
157
- assert(result instanceof Blob);
158
- assert.equal(result.size, data.length + 1024); // Data + 1KB header
159
- });
160
- await it('should handle ArrayBuffer input without metadata', () => {
161
- const buffer = new ArrayBuffer(10);
162
- const result = createFileWithMetadata(/** @type {any} */ (buffer));
163
- assert(result instanceof Blob);
164
- assert.equal(result.size, buffer.byteLength);
165
- });
166
- await it('should handle ArrayBuffer input with metadata', () => {
167
- const buffer = new ArrayBuffer(10);
168
- const metadata = {
169
- name: 'buffer.dat',
170
- type: 'application/octet-stream',
171
- extension: 'dat',
172
- };
173
- const result = createFileWithMetadata(
174
- /** @type {any} */ (buffer), metadata);
175
- assert(result instanceof Blob);
176
- assert.equal(result.size, buffer.byteLength + 1024); // Buffer + 1KB header
177
- });
178
- await it('should throw error for unsupported BlobLike type', () => {
179
- const unsupportedBlobLike = {
180
- stream: () => new ReadableStream(),
181
- size: 100,
182
- };
183
- assert.throws(() => createFileWithMetadata(/** @type {any} */ (unsupportedBlobLike)), /Unsupported BlobLike type - must be Blob, Uint8Array, or ArrayBuffer/);
184
- });
185
- await it('should throw error for unsupported BlobLike type with metadata', () => {
186
- const unsupportedBlobLike = {
187
- stream: () => new ReadableStream(),
188
- size: 100,
189
- };
190
- const metadata = {
191
- name: 'test.txt',
192
- type: 'text/plain',
193
- extension: 'txt',
194
- };
195
- assert.throws(() => createFileWithMetadata(
196
- /** @type {any} */ (unsupportedBlobLike), metadata), /Unsupported BlobLike type - must be Blob, Uint8Array, or ArrayBuffer/);
197
- });
198
- });
199
- await describe('extractFileMetadata', async () => {
200
- await it('should extract metadata from file with header', async () => {
201
- const originalContent = 'test file content';
202
- const originalFile = createMockFile(originalContent);
203
- const metadata = {
204
- name: 'document.pdf',
205
- type: 'application/pdf',
206
- extension: 'pdf',
207
- };
208
- // Create file with metadata
209
- const fileWithMetadata = createFileWithMetadata(originalFile, metadata);
210
- // Convert to stream (simulating decrypted stream)
211
- const stream = fileWithMetadata.stream();
212
- // Extract metadata
213
- const { fileStream, fileMetadata } = await extractFileMetadata(stream);
214
- // Verify metadata was extracted correctly
215
- assert.deepEqual(fileMetadata, metadata);
216
- // Verify file content is preserved
217
- const extractedContent = await streamToArrayBuffer(fileStream);
218
- const originalArrayBuffer = await originalFile.arrayBuffer();
219
- assert.deepEqual(new Uint8Array(extractedContent), new Uint8Array(originalArrayBuffer));
220
- });
221
- await it('should handle file without metadata', async () => {
222
- const originalFile = createMockFile();
223
- const stream = originalFile.stream();
224
- const { fileStream, fileMetadata } = await extractFileMetadata(stream);
225
- assert.equal(fileMetadata, undefined);
226
- assert(fileStream instanceof ReadableStream);
227
- });
228
- await it('should handle malformed metadata gracefully', async () => {
229
- // Create a file with invalid header
230
- const invalidHeader = new Uint8Array(1024);
231
- invalidHeader[0] = 255; // Invalid length
232
- invalidHeader[1] = 255;
233
- invalidHeader[2] = 255;
234
- invalidHeader[3] = 255;
235
- const originalContent = 'test content';
236
- const combined = new Blob([invalidHeader, originalContent]);
237
- const stream = combined.stream();
238
- const { fileStream, fileMetadata } = await extractFileMetadata(stream);
239
- // Should gracefully handle error and return stream without metadata
240
- assert.equal(fileMetadata, undefined);
241
- assert(fileStream instanceof ReadableStream);
242
- });
243
- // NEW EDGE CASE TESTS
244
- await it('should handle empty streams', async () => {
245
- const emptyBlob = new Blob([]);
246
- const stream = emptyBlob.stream();
247
- const { fileStream, fileMetadata } = await extractFileMetadata(stream);
248
- assert.equal(fileMetadata, undefined);
249
- assert(fileStream instanceof ReadableStream);
250
- });
251
- await it('should handle streams smaller than header size', async () => {
252
- const smallBlob = new Blob(['small']);
253
- const stream = smallBlob.stream();
254
- const { fileStream, fileMetadata } = await extractFileMetadata(stream);
255
- assert.equal(fileMetadata, undefined);
256
- assert(fileStream instanceof ReadableStream);
257
- });
258
- await it('should handle malformed JSON in metadata', async () => {
259
- const header = new Uint8Array(1024);
260
- const malformedJson = '{name:"test",invalid}';
261
- const jsonBytes = new TextEncoder().encode(malformedJson);
262
- // Set valid length but invalid JSON
263
- const lengthBytes = new Uint8Array(new Uint32Array([jsonBytes.length]).buffer);
264
- header.set(lengthBytes, 0);
265
- header.set(jsonBytes, 4);
266
- const combined = new Blob([header, 'content']);
267
- const stream = combined.stream();
268
- const { fileStream, fileMetadata } = await extractFileMetadata(stream);
269
- // Should handle malformed JSON gracefully
270
- assert.equal(fileMetadata, undefined);
271
- assert(fileStream instanceof ReadableStream);
272
- });
273
- await it('should handle JSON that is too large', async () => {
274
- const header = new Uint8Array(1024);
275
- const largeJson = JSON.stringify({
276
- name: 'test.txt',
277
- type: 'text/plain',
278
- extension: 'txt',
279
- metadata: { data: 'x'.repeat(800) }, // Creates JSON > 800 chars
280
- });
281
- const jsonBytes = new TextEncoder().encode(largeJson);
282
- if (jsonBytes.length <= 1020) {
283
- // If it fits in header
284
- const lengthBytes = new Uint8Array(new Uint32Array([jsonBytes.length]).buffer);
285
- header.set(lengthBytes, 0);
286
- header.set(jsonBytes, 4);
287
- const combined = new Blob([header, 'content']);
288
- const stream = combined.stream();
289
- const { fileStream, fileMetadata } = await extractFileMetadata(stream);
290
- // Should handle oversized JSON gracefully
291
- assert.equal(fileMetadata, undefined);
292
- assert(fileStream instanceof ReadableStream);
293
- }
294
- });
295
- await it('should handle deeply nested JSON', async () => {
296
- const header = new Uint8Array(1024);
297
- const deeplyNested = {
298
- name: 'test.txt',
299
- type: 'text/plain',
300
- extension: 'txt',
301
- metadata: {
302
- level1: {
303
- level2: {
304
- level3: {
305
- level4: {
306
- level5: {
307
- level6: 'too deep', // Exceeds MAX_JSON_DEPTH (5)
308
- },
309
- },
310
- },
311
- },
312
- },
313
- },
314
- };
315
- const jsonBytes = new TextEncoder().encode(JSON.stringify(deeplyNested));
316
- if (jsonBytes.length <= 1020) {
317
- // If it fits in header
318
- const lengthBytes = new Uint8Array(new Uint32Array([jsonBytes.length]).buffer);
319
- header.set(lengthBytes, 0);
320
- header.set(jsonBytes, 4);
321
- const combined = new Blob([header, 'content']);
322
- const stream = combined.stream();
323
- const { fileStream, fileMetadata } = await extractFileMetadata(stream);
324
- // Should handle deeply nested JSON gracefully
325
- assert.equal(fileMetadata, undefined);
326
- assert(fileStream instanceof ReadableStream);
327
- }
328
- });
329
- await it('should handle binary file content after metadata', async () => {
330
- const binaryData = new Uint8Array([
331
- 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a,
332
- ]);
333
- const binaryFile = new Blob([binaryData]);
334
- const metadata = { name: 'test.png', type: 'image/png', extension: 'png' };
335
- const fileWithMetadata = createFileWithMetadata(binaryFile, metadata);
336
- const stream = fileWithMetadata.stream();
337
- const { fileStream, fileMetadata } = await extractFileMetadata(stream);
338
- assert.deepEqual(fileMetadata, metadata);
339
- // Verify binary content is preserved
340
- const extractedContent = await streamToArrayBuffer(fileStream);
341
- assert.deepEqual(new Uint8Array(extractedContent), binaryData);
342
- });
343
- await it('should handle international characters in extracted metadata', async () => {
344
- const originalFile = createMockFile('内容');
345
- const metadata = {
346
- name: '测试文件.txt',
347
- type: 'text/plain',
348
- extension: 'txt',
349
- metadata: {
350
- author: '作者',
351
- emoji: '🎉📁',
352
- },
353
- };
354
- const fileWithMetadata = createFileWithMetadata(originalFile, metadata);
355
- const stream = fileWithMetadata.stream();
356
- const { fileMetadata } = await extractFileMetadata(stream);
357
- assert.deepEqual(fileMetadata, metadata);
358
- });
359
- await it('should handle zero-length metadata', async () => {
360
- const header = new Uint8Array(1024);
361
- // Set length to 0
362
- const lengthBytes = new Uint8Array(new Uint32Array([0]).buffer);
363
- header.set(lengthBytes, 0);
364
- const combined = new Blob([header, 'content']);
365
- const stream = combined.stream();
366
- const { fileStream, fileMetadata } = await extractFileMetadata(stream);
367
- assert.equal(fileMetadata, undefined);
368
- assert(fileStream instanceof ReadableStream);
369
- });
370
- });
371
- await describe('round-trip test', async () => {
372
- await it('should preserve file content and metadata through full cycle', async () => {
373
- const originalContent = 'This is a test file with some content.';
374
- const originalFile = createMockFile(originalContent);
375
- const metadata = {
376
- name: 'test-document.txt',
377
- type: 'text/plain',
378
- extension: 'txt',
379
- metadata: {
380
- author: 'Test Author',
381
- created: '2024-01-15',
382
- },
383
- };
384
- // Step 1: Create file with metadata
385
- const fileWithMetadata = createFileWithMetadata(originalFile, metadata);
386
- // Step 2: Extract metadata (simulating decryption)
387
- const stream = fileWithMetadata.stream();
388
- const { fileStream, fileMetadata } = await extractFileMetadata(stream);
389
- // Step 3: Verify metadata
390
- assert.deepEqual(fileMetadata, metadata);
391
- // Step 4: Verify file content
392
- const extractedContent = await streamToArrayBuffer(fileStream);
393
- const originalArrayBuffer = await originalFile.arrayBuffer();
394
- assert.deepEqual(new Uint8Array(extractedContent), new Uint8Array(originalArrayBuffer));
395
- });
396
- await it('should preserve binary files with international metadata', async () => {
397
- const binaryData = new Uint8Array([0xff, 0xd8, 0xff, 0xe0]); // JPEG header
398
- const originalFile = new Blob([binaryData], { type: 'image/jpeg' });
399
- const metadata = {
400
- name: '照片.jpg',
401
- type: 'image/jpeg',
402
- extension: 'jpg',
403
- metadata: {
404
- camera: 'Canon EOS 📷',
405
- location: 'Tokyo 🗾',
406
- },
407
- };
408
- const fileWithMetadata = createFileWithMetadata(originalFile, metadata);
409
- const stream = fileWithMetadata.stream();
410
- const { fileStream, fileMetadata } = await extractFileMetadata(stream);
411
- assert.deepEqual(fileMetadata, metadata);
412
- const extractedContent = await streamToArrayBuffer(fileStream);
413
- assert.deepEqual(new Uint8Array(extractedContent), binaryData);
414
- });
415
- await it('should handle large files efficiently', async () => {
416
- // Create a 1MB file
417
- const largeContent = new Uint8Array(1024 * 1024).fill(42);
418
- const largeFile = new Blob([largeContent]);
419
- const metadata = {
420
- name: 'large-file.bin',
421
- type: 'application/octet-stream',
422
- extension: 'bin',
423
- };
424
- const fileWithMetadata = createFileWithMetadata(largeFile, metadata);
425
- const stream = fileWithMetadata.stream();
426
- const { fileStream, fileMetadata } = await extractFileMetadata(stream);
427
- assert.deepEqual(fileMetadata, metadata);
428
- const extractedContent = await streamToArrayBuffer(fileStream);
429
- assert.deepEqual(new Uint8Array(extractedContent), largeContent);
430
- });
431
- });
432
- });
433
- //# sourceMappingURL=file-metadata.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"file-metadata.spec.js","sourceRoot":"","sources":["../../test/file-metadata.spec.js"],"names":[],"mappings":"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"}