@storacha/encrypt-upload-client 1.1.56 → 1.1.58

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 (72) hide show
  1. package/dist/config/constants.d.ts +3 -3
  2. package/dist/config/constants.js +4 -3
  3. package/dist/config/env.d.ts +9 -6
  4. package/dist/config/service.d.ts +13 -13
  5. package/dist/core/client.d.ts +54 -41
  6. package/dist/core/client.js +68 -56
  7. package/dist/core/errors.d.ts +6 -6
  8. package/dist/core/metadata/encrypted-metadata.d.ts +13 -8
  9. package/dist/core/metadata/kms-metadata.d.ts +68 -36
  10. package/dist/core/metadata/lit-metadata.d.ts +63 -28
  11. package/dist/crypto/adapters/kms-crypto-adapter.d.ts +172 -137
  12. package/dist/crypto/adapters/lit-crypto-adapter.d.ts +107 -86
  13. package/dist/crypto/factories.browser.d.ts +9 -5
  14. package/dist/crypto/factories.browser.js +15 -7
  15. package/dist/crypto/factories.node.d.ts +13 -6
  16. package/dist/crypto/factories.node.js +19 -13
  17. package/dist/crypto/index.d.ts +5 -5
  18. package/dist/crypto/index.js +5 -5
  19. package/dist/crypto/symmetric/generic-aes-ctr-streaming-crypto.d.ts +58 -54
  20. package/dist/crypto/symmetric/generic-aes-ctr-streaming-crypto.js +174 -146
  21. package/dist/crypto/symmetric/node-aes-cbc-crypto.d.ts +36 -32
  22. package/dist/crypto/symmetric/node-aes-cbc-crypto.js +101 -95
  23. package/dist/examples/decrypt-test.d.ts +2 -2
  24. package/dist/examples/decrypt-test.js +78 -69
  25. package/dist/examples/encrypt-test.d.ts +5 -3
  26. package/dist/examples/encrypt-test.js +58 -55
  27. package/dist/handlers/decrypt-handler.d.ts +19 -5
  28. package/dist/handlers/encrypt-handler.d.ts +9 -3
  29. package/dist/handlers/encrypt-handler.js +93 -57
  30. package/dist/index.d.ts +2 -2
  31. package/dist/index.js +2 -2
  32. package/dist/protocols/lit.d.ts +33 -9
  33. package/dist/protocols/lit.js +134 -98
  34. package/dist/test/cid-verification.spec.d.ts +2 -2
  35. package/dist/test/cid-verification.spec.js +341 -313
  36. package/dist/test/crypto-compatibility.spec.d.ts +2 -2
  37. package/dist/test/crypto-compatibility.spec.js +184 -120
  38. package/dist/test/crypto-counter-security.spec.d.ts +2 -2
  39. package/dist/test/crypto-counter-security.spec.js +177 -138
  40. package/dist/test/crypto-streaming.spec.d.ts +2 -2
  41. package/dist/test/crypto-streaming.spec.js +208 -126
  42. package/dist/test/encrypted-metadata.spec.d.ts +2 -2
  43. package/dist/test/encrypted-metadata.spec.js +89 -62
  44. package/dist/test/factories.spec.d.ts +2 -2
  45. package/dist/test/factories.spec.js +275 -139
  46. package/dist/test/file-metadata.spec.d.ts +2 -2
  47. package/dist/test/file-metadata.spec.js +472 -416
  48. package/dist/test/fixtures/test-fixtures.d.ts +25 -20
  49. package/dist/test/fixtures/test-fixtures.js +61 -53
  50. package/dist/test/helpers/test-file-utils.d.ts +19 -14
  51. package/dist/test/helpers/test-file-utils.js +78 -76
  52. package/dist/test/https-enforcement.spec.d.ts +2 -2
  53. package/dist/test/https-enforcement.spec.js +278 -124
  54. package/dist/test/kms-crypto-adapter.spec.d.ts +2 -2
  55. package/dist/test/kms-crypto-adapter.spec.js +473 -304
  56. package/dist/test/lit-crypto-adapter.spec.d.ts +2 -2
  57. package/dist/test/lit-crypto-adapter.spec.js +206 -118
  58. package/dist/test/memory-efficiency.spec.d.ts +2 -2
  59. package/dist/test/memory-efficiency.spec.js +100 -87
  60. package/dist/test/mocks/key-manager.d.ts +71 -38
  61. package/dist/test/mocks/key-manager.js +129 -113
  62. package/dist/test/node-crypto-adapter.spec.d.ts +2 -2
  63. package/dist/test/node-crypto-adapter.spec.js +155 -102
  64. package/dist/test/node-generic-crypto-adapter.spec.d.ts +2 -2
  65. package/dist/test/node-generic-crypto-adapter.spec.js +134 -94
  66. package/dist/test/setup.d.ts +2 -2
  67. package/dist/test/setup.js +8 -9
  68. package/dist/tsconfig.spec.tsbuildinfo +1 -1
  69. package/dist/types.d.ts +219 -181
  70. package/dist/utils/file-metadata.d.ts +19 -13
  71. package/dist/utils.d.ts +14 -5
  72. package/package.json +4 -4
@@ -9,42 +9,70 @@
9
9
  * @param {Function} [options.onKeyDecrypt] - Optional callback for decrypt calls
10
10
  */
11
11
  export function createMockKeyManagerService(options: {
12
- mockPublicKey: string;
13
- mockProvider?: string | undefined;
14
- mockAlgorithm?: string | undefined;
15
- onEncryptionSetup?: Function | undefined;
16
- onKeyDecrypt?: Function | undefined;
12
+ mockPublicKey: string
13
+ mockProvider?: string | undefined
14
+ mockAlgorithm?: string | undefined
15
+ onEncryptionSetup?: Function | undefined
16
+ onKeyDecrypt?: Function | undefined
17
17
  }): {
18
- space: {
19
- encryption: {
20
- setup: Server.ServiceMethod<Server.API.Capability<"space/encryption/setup", `did:key:${string}` & `did:${string}` & Server.API.Phantom<{
21
- protocol: "did:";
22
- }>, Partial<Pick<{
23
- location: string | undefined;
24
- keyring: string | undefined;
25
- }, "location" | "keyring">>>, {
26
- publicKey: string;
27
- provider: string;
28
- algorithm: string;
29
- }, Server.API.Failure & {
30
- name: string;
31
- message: string;
32
- }>;
33
- key: {
34
- decrypt: Server.ServiceMethod<Server.API.Capability<"space/encryption/key/decrypt", `did:key:${string}` & `did:${string}` & Server.API.Phantom<{
35
- protocol: "did:";
36
- }>, Pick<{
37
- key: Uint8Array<ArrayBufferLike>;
38
- }, "key">>, {
39
- decryptedSymmetricKey: string;
40
- }, Server.API.Failure & {
41
- name: string;
42
- message: string;
43
- }>;
44
- };
45
- };
46
- };
47
- };
18
+ space: {
19
+ encryption: {
20
+ setup: Server.ServiceMethod<
21
+ Server.API.Capability<
22
+ 'space/encryption/setup',
23
+ `did:key:${string}` &
24
+ `did:${string}` &
25
+ Server.API.Phantom<{
26
+ protocol: 'did:'
27
+ }>,
28
+ Partial<
29
+ Pick<
30
+ {
31
+ location: string | undefined
32
+ keyring: string | undefined
33
+ },
34
+ 'location' | 'keyring'
35
+ >
36
+ >
37
+ >,
38
+ {
39
+ publicKey: string
40
+ provider: string
41
+ algorithm: string
42
+ },
43
+ Server.API.Failure & {
44
+ name: string
45
+ message: string
46
+ }
47
+ >
48
+ key: {
49
+ decrypt: Server.ServiceMethod<
50
+ Server.API.Capability<
51
+ 'space/encryption/key/decrypt',
52
+ `did:key:${string}` &
53
+ `did:${string}` &
54
+ Server.API.Phantom<{
55
+ protocol: 'did:'
56
+ }>,
57
+ Pick<
58
+ {
59
+ key: Uint8Array<ArrayBufferLike>
60
+ },
61
+ 'key'
62
+ >
63
+ >,
64
+ {
65
+ decryptedSymmetricKey: string
66
+ },
67
+ Server.API.Failure & {
68
+ name: string
69
+ message: string
70
+ }
71
+ >
72
+ }
73
+ }
74
+ }
75
+ }
48
76
  /**
49
77
  * Create a mock key manager service server
50
78
  *
@@ -53,6 +81,11 @@ export function createMockKeyManagerService(options: {
53
81
  * @param {number} port - The port to listen on
54
82
  * @param {boolean} [useHttps] - Whether to use HTTPS URLs (testing HTTPS scenarios)
55
83
  */
56
- export function createMockKeyManagerServer(service: object, keyManagerServiceDID: any, port: number, useHttps?: boolean): Promise<any>;
57
- import * as Server from '@ucanto/server';
58
- //# sourceMappingURL=key-manager.d.ts.map
84
+ export function createMockKeyManagerServer(
85
+ service: object,
86
+ keyManagerServiceDID: any,
87
+ port: number,
88
+ useHttps?: boolean
89
+ ): Promise<any>
90
+ import * as Server from '@ucanto/server'
91
+ //# sourceMappingURL=key-manager.d.ts.map
@@ -1,8 +1,8 @@
1
- import { createServer } from 'node:http';
2
- import * as Server from '@ucanto/server';
3
- import { CAR } from '@ucanto/transport';
4
- import * as Space from '@storacha/capabilities/space';
5
- import { base64 } from 'multiformats/bases/base64';
1
+ import { createServer } from 'node:http'
2
+ import * as Server from '@ucanto/server'
3
+ import { CAR } from '@ucanto/transport'
4
+ import * as Space from '@storacha/capabilities/space'
5
+ import { base64 } from 'multiformats/bases/base64'
6
6
  /**
7
7
  * Create mock KMS service with proper capability handlers
8
8
  *
@@ -14,62 +14,68 @@ import { base64 } from 'multiformats/bases/base64';
14
14
  * @param {Function} [options.onKeyDecrypt] - Optional callback for decrypt calls
15
15
  */
16
16
  export function createMockKeyManagerService(options) {
17
- const { mockPublicKey, mockProvider = 'google-kms', mockAlgorithm = 'RSA-OAEP-2048-SHA256', onEncryptionSetup, onKeyDecrypt, } = options;
18
- return {
19
- space: {
20
- encryption: {
21
- setup: Server.provide(Space.EncryptionSetup, async (input) => {
22
- // Call optional callback for testing
23
- if (onEncryptionSetup) {
24
- onEncryptionSetup(input);
25
- }
26
- // Validate the space DID format
27
- if (!input.capability.with.startsWith('did:key:')) {
28
- return Server.error({
29
- name: 'InvalidSpace',
30
- message: 'Space DID must be a did:key',
31
- });
32
- }
33
- // Return mock RSA public key and metadata
34
- return Server.ok({
35
- publicKey: mockPublicKey,
36
- provider: mockProvider,
37
- algorithm: mockAlgorithm,
38
- });
39
- }),
40
- key: {
41
- decrypt: Server.provide(Space.EncryptionKeyDecrypt, async (input) => {
42
- // Call optional callback for testing
43
- if (onKeyDecrypt) {
44
- onKeyDecrypt(input);
45
- }
46
- // Validate the space DID
47
- if (!input.capability.with.startsWith('did:key:')) {
48
- return Server.error({
49
- name: 'InvalidSpace',
50
- message: 'Space DID must be a did:key',
51
- });
52
- }
53
- // Validate encrypted key is provided
54
- if (!input.capability.nb.key) {
55
- return Server.error({
56
- name: 'KeyNotFound',
57
- message: 'key is required',
58
- });
59
- }
60
- // For testing purposes, "decrypt" by converting bytes back to base64 string
61
- // In real implementation, this would call Google KMS
62
- const keyBytes = input.capability.nb.key;
63
- // No base64 decode here, just return the bytes as base64 string for mock
64
- const mockDecryptedKey = base64.encode(keyBytes);
65
- return Server.ok({
66
- decryptedSymmetricKey: mockDecryptedKey,
67
- });
68
- }),
69
- },
70
- },
17
+ const {
18
+ mockPublicKey,
19
+ mockProvider = 'google-kms',
20
+ mockAlgorithm = 'RSA-OAEP-2048-SHA256',
21
+ onEncryptionSetup,
22
+ onKeyDecrypt,
23
+ } = options
24
+ return {
25
+ space: {
26
+ encryption: {
27
+ setup: Server.provide(Space.EncryptionSetup, async (input) => {
28
+ // Call optional callback for testing
29
+ if (onEncryptionSetup) {
30
+ onEncryptionSetup(input)
31
+ }
32
+ // Validate the space DID format
33
+ if (!input.capability.with.startsWith('did:key:')) {
34
+ return Server.error({
35
+ name: 'InvalidSpace',
36
+ message: 'Space DID must be a did:key',
37
+ })
38
+ }
39
+ // Return mock RSA public key and metadata
40
+ return Server.ok({
41
+ publicKey: mockPublicKey,
42
+ provider: mockProvider,
43
+ algorithm: mockAlgorithm,
44
+ })
45
+ }),
46
+ key: {
47
+ decrypt: Server.provide(Space.EncryptionKeyDecrypt, async (input) => {
48
+ // Call optional callback for testing
49
+ if (onKeyDecrypt) {
50
+ onKeyDecrypt(input)
51
+ }
52
+ // Validate the space DID
53
+ if (!input.capability.with.startsWith('did:key:')) {
54
+ return Server.error({
55
+ name: 'InvalidSpace',
56
+ message: 'Space DID must be a did:key',
57
+ })
58
+ }
59
+ // Validate encrypted key is provided
60
+ if (!input.capability.nb.key) {
61
+ return Server.error({
62
+ name: 'KeyNotFound',
63
+ message: 'key is required',
64
+ })
65
+ }
66
+ // For testing purposes, "decrypt" by converting bytes back to base64 string
67
+ // In real implementation, this would call Google KMS
68
+ const keyBytes = input.capability.nb.key
69
+ // No base64 decode here, just return the bytes as base64 string for mock
70
+ const mockDecryptedKey = base64.encode(keyBytes)
71
+ return Server.ok({
72
+ decryptedSymmetricKey: mockDecryptedKey,
73
+ })
74
+ }),
71
75
  },
72
- };
76
+ },
77
+ },
78
+ }
73
79
  }
74
80
  /**
75
81
  * Create a mock key manager service server
@@ -79,59 +85,69 @@ export function createMockKeyManagerService(options) {
79
85
  * @param {number} port - The port to listen on
80
86
  * @param {boolean} [useHttps] - Whether to use HTTPS URLs (testing HTTPS scenarios)
81
87
  */
82
- export function createMockKeyManagerServer(service, keyManagerServiceDID, port, useHttps = false) {
83
- const ucantoServer = Server.create({
84
- id: keyManagerServiceDID,
85
- service,
86
- codec: CAR.inbound,
87
- validateAuthorization: () => ({ ok: {} }), // Skip auth validation for tests
88
- });
89
- const httpServer = createServer(async (req, res) => {
90
- res.setHeader('Access-Control-Allow-Origin', '*');
91
- res.setHeader('Access-Control-Allow-Methods', '*');
92
- res.setHeader('Access-Control-Allow-Headers', '*');
93
- if (req.method === 'OPTIONS')
94
- return res.end();
95
- if (req.method === 'POST') {
96
- const bodyBuffer = Buffer.concat(await collect(req));
97
- const reqHeaders = /** @type {Record<string, string>} */ (Object.fromEntries(Object.entries(req.headers)));
98
- const { headers, body, status } = await ucantoServer.request({
99
- body: new Uint8Array(bodyBuffer.buffer, bodyBuffer.byteOffset, bodyBuffer.byteLength),
100
- headers: reqHeaders,
101
- });
102
- for (const [key, value] of Object.entries(headers)) {
103
- res.setHeader(key, value);
104
- }
105
- res.writeHead(status ?? 200);
106
- res.end(body);
107
- }
108
- else {
109
- res.end();
110
- }
111
- });
112
- return new Promise((resolve, reject) => {
113
- httpServer.listen(port, (/** @type {Error | undefined} */ err) => {
114
- if (err) {
115
- reject(err);
116
- }
117
- else {
118
- const protocol = useHttps ? 'https' : 'http';
119
- resolve({
120
- server: httpServer,
121
- url: `${protocol}://localhost:${port}`,
122
- close: () => new Promise((resolve) => httpServer.close(resolve)),
123
- });
124
- }
125
- });
126
- });
88
+ export function createMockKeyManagerServer(
89
+ service,
90
+ keyManagerServiceDID,
91
+ port,
92
+ useHttps = false
93
+ ) {
94
+ const ucantoServer = Server.create({
95
+ id: keyManagerServiceDID,
96
+ service,
97
+ codec: CAR.inbound,
98
+ validateAuthorization: () => ({ ok: {} }), // Skip auth validation for tests
99
+ })
100
+ const httpServer = createServer(async (req, res) => {
101
+ res.setHeader('Access-Control-Allow-Origin', '*')
102
+ res.setHeader('Access-Control-Allow-Methods', '*')
103
+ res.setHeader('Access-Control-Allow-Headers', '*')
104
+ if (req.method === 'OPTIONS') return res.end()
105
+ if (req.method === 'POST') {
106
+ const bodyBuffer = Buffer.concat(await collect(req))
107
+ const reqHeaders = /** @type {Record<string, string>} */ (
108
+ Object.fromEntries(Object.entries(req.headers))
109
+ )
110
+ const { headers, body, status } = await ucantoServer.request({
111
+ body: new Uint8Array(
112
+ bodyBuffer.buffer,
113
+ bodyBuffer.byteOffset,
114
+ bodyBuffer.byteLength
115
+ ),
116
+ headers: reqHeaders,
117
+ })
118
+ for (const [key, value] of Object.entries(headers)) {
119
+ res.setHeader(key, value)
120
+ }
121
+ res.writeHead(status ?? 200)
122
+ res.end(body)
123
+ } else {
124
+ res.end()
125
+ }
126
+ })
127
+ return new Promise((resolve, reject) => {
128
+ httpServer.listen(port, (/** @type {Error | undefined} */ err) => {
129
+ if (err) {
130
+ reject(err)
131
+ } else {
132
+ const protocol = useHttps ? 'https' : 'http'
133
+ resolve({
134
+ server: httpServer,
135
+ url: `${protocol}://localhost:${port}`,
136
+ close: () => new Promise((resolve) => httpServer.close(resolve)),
137
+ })
138
+ }
139
+ })
140
+ })
127
141
  }
128
142
  /** @param {import('node:stream').Readable} stream */
129
143
  const collect = (stream) => {
130
- return /** @type {Promise<Buffer[]>} */ (new Promise((resolve, reject) => {
131
- const chunks = /** @type {Buffer[]} */ ([]);
132
- stream.on('data', (chunk) => chunks.push(Buffer.from(chunk)));
133
- stream.on('error', (err) => reject(err));
134
- stream.on('end', () => resolve(chunks));
135
- }));
136
- };
137
- //# sourceMappingURL=key-manager.js.map
144
+ return /** @type {Promise<Buffer[]>} */ (
145
+ new Promise((resolve, reject) => {
146
+ const chunks = /** @type {Buffer[]} */ ([])
147
+ stream.on('data', (chunk) => chunks.push(Buffer.from(chunk)))
148
+ stream.on('error', (err) => reject(err))
149
+ stream.on('end', () => resolve(chunks))
150
+ })
151
+ )
152
+ }
153
+ //# sourceMappingURL=key-manager.js.map
@@ -1,2 +1,2 @@
1
- export {};
2
- //# sourceMappingURL=node-crypto-adapter.spec.d.ts.map
1
+ export {}
2
+ //# sourceMappingURL=node-crypto-adapter.spec.d.ts.map