@storacha/encrypt-upload-client 0.0.39 → 1.0.0

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 (55) hide show
  1. package/dist/config/env.d.ts.map +1 -1
  2. package/dist/config/env.js +19 -6
  3. package/dist/core/client.d.ts +8 -12
  4. package/dist/core/client.d.ts.map +1 -1
  5. package/dist/core/client.js +12 -21
  6. package/dist/core/metadata/encrypted-metadata.d.ts +8 -0
  7. package/dist/core/metadata/encrypted-metadata.d.ts.map +1 -0
  8. package/dist/core/metadata/encrypted-metadata.js +69 -0
  9. package/dist/core/metadata/kms-metadata.d.ts +36 -0
  10. package/dist/core/metadata/kms-metadata.d.ts.map +1 -0
  11. package/dist/core/metadata/kms-metadata.js +156 -0
  12. package/dist/core/{encrypted-metadata.d.ts → metadata/lit-metadata.d.ts} +11 -11
  13. package/dist/core/metadata/lit-metadata.d.ts.map +1 -0
  14. package/dist/core/{encrypted-metadata.js → metadata/lit-metadata.js} +32 -42
  15. package/dist/crypto/adapters/kms-crypto-adapter.d.ts +148 -0
  16. package/dist/crypto/adapters/kms-crypto-adapter.d.ts.map +1 -0
  17. package/dist/crypto/adapters/kms-crypto-adapter.js +321 -0
  18. package/dist/crypto/adapters/lit-crypto-adapter.d.ts +96 -0
  19. package/dist/crypto/adapters/lit-crypto-adapter.d.ts.map +1 -0
  20. package/dist/crypto/adapters/lit-crypto-adapter.js +210 -0
  21. package/dist/crypto/factories.browser.d.ts +11 -0
  22. package/dist/crypto/factories.browser.d.ts.map +1 -0
  23. package/dist/crypto/factories.browser.js +16 -0
  24. package/dist/crypto/factories.node.d.ts +26 -0
  25. package/dist/crypto/factories.node.d.ts.map +1 -0
  26. package/dist/crypto/factories.node.js +38 -0
  27. package/dist/crypto/index.d.ts +5 -0
  28. package/dist/crypto/index.d.ts.map +1 -0
  29. package/dist/crypto/index.js +7 -0
  30. package/dist/crypto/symmetric/generic-aes-ctr-streaming-crypto.d.ts +76 -0
  31. package/dist/crypto/symmetric/generic-aes-ctr-streaming-crypto.d.ts.map +1 -0
  32. package/dist/crypto/symmetric/generic-aes-ctr-streaming-crypto.js +177 -0
  33. package/dist/crypto/symmetric/node-aes-cbc-crypto.d.ts +43 -0
  34. package/dist/crypto/symmetric/node-aes-cbc-crypto.d.ts.map +1 -0
  35. package/dist/crypto/symmetric/node-aes-cbc-crypto.js +110 -0
  36. package/dist/handlers/decrypt-handler.d.ts +9 -4
  37. package/dist/handlers/decrypt-handler.d.ts.map +1 -1
  38. package/dist/handlers/decrypt-handler.js +62 -93
  39. package/dist/handlers/encrypt-handler.d.ts +1 -1
  40. package/dist/handlers/encrypt-handler.d.ts.map +1 -1
  41. package/dist/handlers/encrypt-handler.js +31 -41
  42. package/dist/index.d.ts +0 -1
  43. package/dist/index.js +0 -1
  44. package/dist/protocols/lit.d.ts +1 -3
  45. package/dist/protocols/lit.d.ts.map +1 -1
  46. package/dist/types.d.ts +135 -20
  47. package/dist/types.d.ts.map +1 -1
  48. package/package.json +27 -18
  49. package/dist/core/encrypted-metadata.d.ts.map +0 -1
  50. package/dist/crypto-adapters/browser-crypto-adapter.d.ts +0 -42
  51. package/dist/crypto-adapters/browser-crypto-adapter.d.ts.map +0 -1
  52. package/dist/crypto-adapters/browser-crypto-adapter.js +0 -109
  53. package/dist/crypto-adapters/node-crypto-adapter.d.ts +0 -17
  54. package/dist/crypto-adapters/node-crypto-adapter.d.ts.map +0 -1
  55. package/dist/crypto-adapters/node-crypto-adapter.js +0 -66
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/config/env.js"],"names":[],"mappings":";AAwBA;;;GAAsC;uBAvBf,cAAc"}
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/config/env.js"],"names":[],"mappings":";AAwCA;;;GAAsC;uBAxCf,cAAc"}
@@ -1,9 +1,17 @@
1
- import dotenv from 'dotenv';
2
1
  import { Schema } from '@ucanto/core';
3
2
  import { LIT_NETWORK } from '@lit-protocol/constants';
4
- // Only load env variables if running in node
5
- if (typeof window === 'undefined') {
6
- dotenv.config();
3
+ // Only conditionally load dotenv in Node.js environments to prevent browser bundling issues
4
+ if (typeof window === 'undefined' &&
5
+ typeof process !== 'undefined' &&
6
+ process.versions) {
7
+ try {
8
+ // Use eval to prevent webpack from bundling dotenv in browser builds
9
+ const dotenv = eval('require')('dotenv');
10
+ dotenv.config();
11
+ }
12
+ catch (error) {
13
+ // dotenv not available or we're in a browser-like environment, continue with defaults
14
+ }
7
15
  }
8
16
  const envSchema = Schema.struct({
9
17
  LIT_NETWORK: Schema.enum([
@@ -14,9 +22,14 @@ const envSchema = Schema.struct({
14
22
  ]).default(LIT_NETWORK.DatilTest),
15
23
  LIT_DEBUG: Schema.boolean().default(false),
16
24
  });
25
+ // Safe environment variable access
17
26
  const processEnv = {
18
- LIT_DEBUG: process.env.LIT_DEBUG,
19
- LIT_NETWORK: process.env.LIT_NETWORK,
27
+ LIT_DEBUG: typeof process !== 'undefined' && process.env
28
+ ? process.env.LIT_DEBUG
29
+ : undefined,
30
+ LIT_NETWORK: typeof process !== 'undefined' && process.env
31
+ ? process.env.LIT_NETWORK
32
+ : undefined,
20
33
  };
21
34
  const env = envSchema.from(processEnv);
22
35
  export default env;
@@ -3,10 +3,9 @@ export class EncryptedClient implements Type.EncryptedClient {
3
3
  /**
4
4
  * @param {import('@storacha/client').Client} storachaClient
5
5
  * @param {Type.CryptoAdapter} cryptoAdapter
6
- * @param {import('@lit-protocol/lit-node-client').LitNodeClient} litClient
7
6
  * @param {URL} gatewayURL
8
7
  */
9
- constructor(storachaClient: import("@storacha/client").Client, cryptoAdapter: Type.CryptoAdapter, litClient: import("@lit-protocol/lit-node-client").LitNodeClient, gatewayURL: URL);
8
+ constructor(storachaClient: import("@storacha/client").Client, cryptoAdapter: Type.CryptoAdapter, gatewayURL: URL);
10
9
  /**
11
10
  * @type {Type.CryptoAdapter}
12
11
  * @protected
@@ -17,32 +16,29 @@ export class EncryptedClient implements Type.EncryptedClient {
17
16
  * @protected
18
17
  */
19
18
  protected _storachaClient: import("@storacha/client").Client;
20
- /**
21
- * @type {import('@lit-protocol/lit-node-client').LitNodeClient}
22
- * @protected
23
- */
24
- protected _litClient: import("@lit-protocol/lit-node-client").LitNodeClient;
25
19
  /**
26
20
  * @type {URL}
27
21
  * @protected
28
22
  */
29
23
  protected _gatewayURL: URL;
30
24
  /**
31
- * Upload an encrypted file to the Storacha network
25
+ * Encrypt and upload a file to the Storacha network
32
26
  *
33
27
  * @param {Type.BlobLike} file - The file to upload
28
+ * @param {Type.EncryptionConfig} encryptionConfig - User-provided encryption configuration
29
+ * @param {Type.UploadOptions} [uploadOptions] - User-provided upload options
34
30
  * @returns {Promise<Type.AnyLink>} - The link to the uploaded file
35
31
  */
36
- uploadEncryptedFile(file: Type.BlobLike): Promise<Type.AnyLink>;
32
+ encryptAndUploadFile(file: Type.BlobLike, encryptionConfig: Type.EncryptionConfig, uploadOptions?: Type.UploadOptions): Promise<Type.AnyLink>;
37
33
  /**
38
34
  * Retrieve and decrypt a file from the Storacha network
39
35
  *
40
- * @param {Type.LitWalletSigner | Type.LitPkpSigner} signer - The wallet or PKP key signer to decrypt the file
41
36
  * @param {Type.AnyLink} cid - The link to the file to retrieve
42
- * @param {Uint8Array} delegationCAR - The delegation that gives permission to decrypt the file
37
+ * @param {Uint8Array} delegationCAR - The delegation that gives permission to decrypt (required for both strategies)
38
+ * @param {Type.DecryptionOptions} decryptionOptions - User-provided decryption options
43
39
  * @returns {Promise<ReadableStream>} - The decrypted file
44
40
  */
45
- retrieveAndDecryptFile(signer: Type.LitWalletSigner | Type.LitPkpSigner, cid: Type.AnyLink, delegationCAR: Uint8Array): Promise<ReadableStream>;
41
+ retrieveAndDecryptFile(cid: Type.AnyLink, delegationCAR: Uint8Array, decryptionOptions: Type.DecryptionOptions): Promise<ReadableStream>;
46
42
  }
47
43
  export function create(options: Type.EncryptedClientOptions): Promise<EncryptedClient>;
48
44
  import * as Type from '../types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/core/client.js"],"names":[],"mappings":"AAMA,yCAAyC;AACzC,wCADiB,IAAI,CAAC,eAAe;IA0BnC;;;;;OAKG;IACH,4BALW,OAAO,kBAAkB,EAAE,MAAM,iBACjC,IAAI,CAAC,aAAa,aAClB,OAAO,+BAA+B,EAAE,aAAa,cACrD,GAAG,EAOb;IAnCD;;;OAGG;IACH,0BAHU,IAAI,CAAC,aAAa,CAGd;IAEd;;;OAGG;IACH,2BAHU,OAAO,kBAAkB,EAAE,MAAM,CAG5B;IAEf;;;OAGG;IACH,sBAHU,OAAO,+BAA+B,EAAE,aAAa,CAGrD;IAEV;;;OAGG;IACH,uBAHU,GAAG,CAGF;IAeX;;;;;OAKG;IACH,0BAHW,IAAI,CAAC,QAAQ,GACX,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CASjC;IAED;;;;;;;OAOG;IACH,+BALW,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,YAAY,OACxC,IAAI,CAAC,OAAO,iBACZ,UAAU,GACR,OAAO,CAAC,cAAc,CAAC,CAYnC;CACF;AAWM,gCAFI,IAAI,CAAC,sBAAsB,4BAcrC;sBAtGqB,aAAa"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/core/client.js"],"names":[],"mappings":"AAKA,yCAAyC;AACzC,wCADiB,IAAI,CAAC,eAAe;IAoBnC;;;;OAIG;IACH,4BAJW,OAAO,kBAAkB,EAAE,MAAM,iBACjC,IAAI,CAAC,aAAa,cAClB,GAAG,EAMb;IA3BD;;;OAGG;IACH,0BAHU,IAAI,CAAC,aAAa,CAGd;IAEd;;;OAGG;IACH,2BAHU,OAAO,kBAAkB,EAAE,MAAM,CAG5B;IAEf;;;OAGG;IACH,uBAHU,GAAG,CAGF;IAaX;;;;;;;OAOG;IACH,2BALW,IAAI,CAAC,QAAQ,oBACb,IAAI,CAAC,gBAAgB,kBACrB,IAAI,CAAC,aAAa,GAChB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAUjC;IAED;;;;;;;OAOG;IACH,4BALW,IAAI,CAAC,OAAO,iBACZ,UAAU,qBACV,IAAI,CAAC,iBAAiB,GACpB,OAAO,CAAC,cAAc,CAAC,CAWnC;CACF;AASM,gCAFI,IAAI,CAAC,sBAAsB,4BAQrC;sBAvFqB,aAAa"}
@@ -1,5 +1,4 @@
1
1
  import * as Type from '../types.js';
2
- import { getLitClient } from '../protocols/lit.js';
3
2
  import { GATEWAY_URL } from '../config/constants.js';
4
3
  import { encryptAndUpload } from '../handlers/encrypt-handler.js';
5
4
  import { retrieveAndDecrypt } from '../handlers/decrypt-handler.js';
@@ -15,11 +14,6 @@ export class EncryptedClient {
15
14
  * @protected
16
15
  */
17
16
  _storachaClient;
18
- /**
19
- * @type {import('@lit-protocol/lit-node-client').LitNodeClient}
20
- * @protected
21
- */
22
- _litClient;
23
17
  /**
24
18
  * @type {URL}
25
19
  * @protected
@@ -28,50 +22,47 @@ export class EncryptedClient {
28
22
  /**
29
23
  * @param {import('@storacha/client').Client} storachaClient
30
24
  * @param {Type.CryptoAdapter} cryptoAdapter
31
- * @param {import('@lit-protocol/lit-node-client').LitNodeClient} litClient
32
25
  * @param {URL} gatewayURL
33
26
  */
34
- constructor(storachaClient, cryptoAdapter, litClient, gatewayURL) {
27
+ constructor(storachaClient, cryptoAdapter, gatewayURL) {
35
28
  this._storachaClient = storachaClient;
36
29
  this._cryptoAdapter = cryptoAdapter;
37
- this._litClient = litClient;
38
30
  this._gatewayURL = gatewayURL;
39
31
  }
40
32
  /**
41
- * Upload an encrypted file to the Storacha network
33
+ * Encrypt and upload a file to the Storacha network
42
34
  *
43
35
  * @param {Type.BlobLike} file - The file to upload
36
+ * @param {Type.EncryptionConfig} encryptionConfig - User-provided encryption configuration
37
+ * @param {Type.UploadOptions} [uploadOptions] - User-provided upload options
44
38
  * @returns {Promise<Type.AnyLink>} - The link to the uploaded file
45
39
  */
46
- async uploadEncryptedFile(file) {
47
- return encryptAndUpload(this._storachaClient, this._litClient, this._cryptoAdapter, file);
40
+ async encryptAndUploadFile(file, encryptionConfig, uploadOptions = {}) {
41
+ return encryptAndUpload(this._storachaClient, this._cryptoAdapter, file, encryptionConfig, uploadOptions);
48
42
  }
49
43
  /**
50
44
  * Retrieve and decrypt a file from the Storacha network
51
45
  *
52
- * @param {Type.LitWalletSigner | Type.LitPkpSigner} signer - The wallet or PKP key signer to decrypt the file
53
46
  * @param {Type.AnyLink} cid - The link to the file to retrieve
54
- * @param {Uint8Array} delegationCAR - The delegation that gives permission to decrypt the file
47
+ * @param {Uint8Array} delegationCAR - The delegation that gives permission to decrypt (required for both strategies)
48
+ * @param {Type.DecryptionOptions} decryptionOptions - User-provided decryption options
55
49
  * @returns {Promise<ReadableStream>} - The decrypted file
56
50
  */
57
- async retrieveAndDecryptFile(signer, cid, delegationCAR) {
58
- return retrieveAndDecrypt(this._storachaClient, this._litClient, this._cryptoAdapter, this._gatewayURL, signer, cid, delegationCAR);
51
+ async retrieveAndDecryptFile(cid, delegationCAR, decryptionOptions) {
52
+ return retrieveAndDecrypt(this._storachaClient, this._cryptoAdapter, this._gatewayURL, cid, delegationCAR, decryptionOptions);
59
53
  }
60
54
  }
61
55
  /**
62
- * Creates a new EncryptClient.
63
- *
64
- * If no Lit Client is provided, one will be created based on the LIT_NETWORK environment variable, defaulting to "DatilTest" if not set.
56
+ * Creates a new EncryptedClient.
65
57
  *
66
58
  * If no Gateway URL is provided, the default value of 'https://w3s.link' will be used.
67
59
  *
68
60
  * @param {Type.EncryptedClientOptions} options
69
61
  */
70
62
  export const create = async (options) => {
71
- const litClient = options.litClient ?? (await getLitClient());
72
63
  const cryptoAdapter = options.cryptoAdapter;
73
64
  const gatewayURL = options.gatewayURL ?? GATEWAY_URL;
74
65
  const storachaClient = options.storachaClient;
75
- return new EncryptedClient(storachaClient, cryptoAdapter, litClient, gatewayURL);
66
+ return new EncryptedClient(storachaClient, cryptoAdapter, gatewayURL);
76
67
  };
77
68
  //# sourceMappingURL=client.js.map
@@ -0,0 +1,8 @@
1
+ export function extract(archive: Uint8Array): any;
2
+ export function create(strategy: "lit" | "kms", data: any): import("../../types.js").LitMetadataView | import("../../types.js").KMSMetadataView;
3
+ export function getSupportedVersions(): string[];
4
+ export function isVersionSupported(version: string): boolean;
5
+ import * as LitMetadata from './lit-metadata.js';
6
+ import * as KMSMetadata from './kms-metadata.js';
7
+ export { LitMetadata, KMSMetadata };
8
+ //# sourceMappingURL=encrypted-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encrypted-metadata.d.ts","sourceRoot":"","sources":["../../../src/core/metadata/encrypted-metadata.js"],"names":[],"mappings":"AAuBO,iCAHI,UAAU,GACR,GAAG,CA8Bf;AAQM,iCAHI,KAAK,GAAG,KAAK,QACb,GAAG,uFAWb;AAKM,iDAAuD;AAOvD,4CAFI,MAAM,WAEgD;6BA1EpC,mBAAmB;6BACnB,mBAAmB"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Universal Encrypted Metadata Orchestrator
3
+ * Routes between different encryption strategies (Lit, KMS, etc.)
4
+ * Each network gets its own version
5
+ */
6
+ import * as LitMetadata from './lit-metadata.js';
7
+ import * as KMSMetadata from './kms-metadata.js';
8
+ import { CAR, error } from '@ucanto/core';
9
+ import * as dagCBOR from '@ipld/dag-cbor';
10
+ import { UnknownFormat } from '../errors.js';
11
+ const FORMATS = {
12
+ [LitMetadata.version]: LitMetadata, // 'encrypted-metadata@0.1'
13
+ [KMSMetadata.version]: KMSMetadata, // 'encrypted-metadata@0.2'
14
+ };
15
+ /**
16
+ * Universal extract function - tries each registered format
17
+ *
18
+ * @param {Uint8Array} archive
19
+ * @returns {any}
20
+ */
21
+ export const extract = (archive) => {
22
+ // Decode CAR to check version
23
+ const { roots } = CAR.decode(archive);
24
+ if (!roots.length) {
25
+ return error(new UnknownFormat('missing root block'));
26
+ }
27
+ const { code } = roots[0].cid;
28
+ if (code !== dagCBOR.code) {
29
+ return error(new UnknownFormat(`unexpected root CID codec: 0x${code.toString(16)}`));
30
+ }
31
+ // Check which version this metadata uses
32
+ const value = dagCBOR.decode(roots[0].bytes);
33
+ for (const [version, formatModule] of Object.entries(FORMATS)) {
34
+ if (value && typeof value === 'object' && version in value) {
35
+ // Found matching version, delegate to specific format module
36
+ return formatModule.extract(archive);
37
+ }
38
+ }
39
+ return error(new UnknownFormat('Unknown metadata format - no matching version found'));
40
+ };
41
+ /**
42
+ * Create metadata for specific strategy
43
+ *
44
+ * @param {'lit' | 'kms'} strategy
45
+ * @param {any} data
46
+ */
47
+ export const create = (strategy, data) => {
48
+ switch (strategy) {
49
+ case 'lit':
50
+ return LitMetadata.create(data);
51
+ case 'kms':
52
+ return KMSMetadata.create(data);
53
+ default:
54
+ throw new Error(`Unknown encryption strategy: ${strategy}`);
55
+ }
56
+ };
57
+ /**
58
+ * Get available format versions
59
+ */
60
+ export const getSupportedVersions = () => Object.keys(FORMATS);
61
+ /**
62
+ * Check if a version is supported
63
+ *
64
+ * @param {string} version
65
+ */
66
+ export const isVersionSupported = (version) => version in FORMATS;
67
+ // Re-export format modules for direct access if needed
68
+ export { LitMetadata, KMSMetadata };
69
+ //# sourceMappingURL=encrypted-metadata.js.map
@@ -0,0 +1,36 @@
1
+ export const version: "encrypted-metadata@0.2";
2
+ export const KMSMetadataSchema: Schema.VariantSchema<{
3
+ "encrypted-metadata@0.2": Schema.StructSchema<{
4
+ encryptedDataCID: Schema.Schema<Link.Link<unknown, number, number, 0 | 1>, any>;
5
+ encryptedSymmetricKey: Schema.StringSchema<string, unknown>;
6
+ space: Schema.StringSchema<string, unknown>;
7
+ kms: Schema.StructSchema<{
8
+ provider: Schema.StringSchema<string, unknown>;
9
+ keyId: Schema.StringSchema<string, unknown>;
10
+ algorithm: Schema.StringSchema<string, unknown>;
11
+ }, any>;
12
+ }, unknown>;
13
+ }, unknown>;
14
+ export const KMSMetadataInputSchema: Schema.StructSchema<{
15
+ encryptedDataCID: Schema.StringSchema<string, unknown>;
16
+ encryptedSymmetricKey: Schema.StringSchema<string, unknown>;
17
+ space: Schema.StringSchema<string, unknown>;
18
+ kms: Schema.StructSchema<{
19
+ provider: Schema.StringSchema<string, unknown>;
20
+ keyId: Schema.StringSchema<string, unknown>;
21
+ algorithm: Schema.StringSchema<string, unknown>;
22
+ }, any>;
23
+ }, unknown>;
24
+ export function create(kmsMetadataInput: Types.KMSMetadata | Types.KMSMetadataInput): Types.KMSMetadataView;
25
+ export function toJSON(kmsMetadata: Types.KMSMetadataView): Types.KMSMetadataInput;
26
+ export function parse(kmsMetadataInput: Types.KMSMetadataInput): Types.KMSMetadata;
27
+ export function archiveBlock(kmsMetadataInput: Types.KMSMetadata): Promise<import("@ucanto/interface").Block>;
28
+ export function archive(kmsMetadata: Types.KMSMetadata): Promise<Types.Result<Uint8Array>>;
29
+ export function extract(archive: Uint8Array): Types.Result<Types.KMSMetadataView, Types.UnknownFormat>;
30
+ export function view({ root }: {
31
+ root: Types.IPLDBlock;
32
+ }): Types.Result<Types.KMSMetadataView, Types.UnknownFormat>;
33
+ import * as Link from 'multiformats/link';
34
+ import { Schema } from '@ucanto/core';
35
+ import * as Types from '../../types.js';
36
+ //# sourceMappingURL=kms-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kms-metadata.d.ts","sourceRoot":"","sources":["../../../src/core/metadata/kms-metadata.js"],"names":[],"mappings":"AASA,sBAAuB,wBAAwB,CAAA;AAE/C;;;;;;;;;;;YAWE;AAEF;;;;;;;;;YASE;AAgEK,yCAHI,KAAK,CAAC,WAAW,GAAC,KAAK,CAAC,gBAAgB,GACtC,KAAK,CAAC,eAAe,CAE2C;AAMtE,oCAHI,KAAK,CAAC,eAAe,GACnB,KAAK,CAAC,gBAAgB,CAOjC;AAMK,wCAHI,KAAK,CAAC,gBAAgB,GACpB,KAAK,CAAC,WAAW,CAO5B;AAMK,+CAHI,KAAK,CAAC,WAAW,GACf,OAAO,CAAC,OAAO,mBAAmB,EAAE,KAAK,CAAC,CAOtD;AAMM,qCAHI,KAAK,CAAC,WAAW,GACf,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAK7C;AAMM,iCAHI,UAAU,GACR,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,aAAa,CAAC,CAiBpE;AAOM,+BAHJ;IAAgC,IAAI,EAA5B,KAAK,CAAC,SAAS;CACvB,GAAU,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,aAAa,CAAC,CAiBpE;sBApLqB,mBAAmB;uBAEF,cAAc;uBAE9B,gBAAgB"}
@@ -0,0 +1,156 @@
1
+ import { CID } from 'multiformats';
2
+ import * as dagCBOR from '@ipld/dag-cbor';
3
+ import * as Link from 'multiformats/link';
4
+ import { sha256 } from 'multiformats/hashes/sha2';
5
+ import { CAR, ok, error, Schema } from '@ucanto/core';
6
+ import * as Types from '../../types.js';
7
+ import { UnknownFormat } from '../errors.js';
8
+ export const version = 'encrypted-metadata@0.2';
9
+ export const KMSMetadataSchema = Schema.variant({
10
+ [version]: Schema.struct({
11
+ encryptedDataCID: Schema.link(),
12
+ encryptedSymmetricKey: Schema.string(),
13
+ space: Schema.string(), // SpaceDID as string
14
+ kms: Schema.struct({
15
+ provider: Schema.string(),
16
+ keyId: Schema.string(),
17
+ algorithm: Schema.string(),
18
+ }),
19
+ }),
20
+ });
21
+ export const KMSMetadataInputSchema = Schema.struct({
22
+ encryptedDataCID: Schema.string(),
23
+ encryptedSymmetricKey: Schema.string(),
24
+ space: Schema.string(),
25
+ kms: Schema.struct({
26
+ provider: Schema.string(),
27
+ keyId: Schema.string(),
28
+ algorithm: Schema.string(),
29
+ }),
30
+ });
31
+ /** @implements {Types.KMSMetadataView} */
32
+ class KMSMetadata {
33
+ #encryptedDataCID;
34
+ #encryptedSymmetricKey;
35
+ #space;
36
+ #kms;
37
+ /** @param {Types.KMSMetadata|Types.KMSMetadataInput} kmsMetadataInput */
38
+ constructor(kmsMetadataInput) {
39
+ /** @type {Types.KMSMetadata} */
40
+ let kmsMetadata;
41
+ if (KMSMetadataInputSchema.is(kmsMetadataInput)) {
42
+ kmsMetadata = parse(
43
+ /** @type {Types.KMSMetadataInput} */ (kmsMetadataInput));
44
+ }
45
+ else {
46
+ kmsMetadata = /** @type {Types.KMSMetadata} */ (kmsMetadataInput);
47
+ }
48
+ this.#encryptedDataCID = kmsMetadata.encryptedDataCID;
49
+ this.#encryptedSymmetricKey = kmsMetadata.encryptedSymmetricKey;
50
+ this.#space = kmsMetadata.space;
51
+ this.#kms = kmsMetadata.kms;
52
+ }
53
+ get encryptedDataCID() {
54
+ return this.#encryptedDataCID;
55
+ }
56
+ get encryptedSymmetricKey() {
57
+ return this.#encryptedSymmetricKey;
58
+ }
59
+ get space() {
60
+ return this.#space;
61
+ }
62
+ get kms() {
63
+ return this.#kms;
64
+ }
65
+ archiveBlock() {
66
+ /** @type {Types.KMSMetadata} */
67
+ const input = {
68
+ encryptedDataCID: this.encryptedDataCID,
69
+ encryptedSymmetricKey: this.encryptedSymmetricKey,
70
+ space: this.space,
71
+ kms: this.kms,
72
+ };
73
+ return archiveBlock(input);
74
+ }
75
+ /** @returns {Types.KMSMetadataInput} */
76
+ toJSON() {
77
+ return toJSON(this);
78
+ }
79
+ }
80
+ /**
81
+ * @param {Types.KMSMetadata|Types.KMSMetadataInput} kmsMetadataInput
82
+ * @returns {Types.KMSMetadataView}
83
+ */
84
+ export const create = (kmsMetadataInput) => new KMSMetadata(kmsMetadataInput);
85
+ /**
86
+ * @param {Types.KMSMetadataView} kmsMetadata
87
+ * @returns {Types.KMSMetadataInput}
88
+ */
89
+ export const toJSON = (kmsMetadata) => ({
90
+ encryptedDataCID: kmsMetadata.encryptedDataCID.toString(),
91
+ encryptedSymmetricKey: kmsMetadata.encryptedSymmetricKey,
92
+ space: kmsMetadata.space,
93
+ kms: kmsMetadata.kms,
94
+ });
95
+ /**
96
+ * @param {Types.KMSMetadataInput} kmsMetadataInput
97
+ * @returns {Types.KMSMetadata}
98
+ */
99
+ export const parse = (kmsMetadataInput) => ({
100
+ encryptedDataCID: CID.parse(kmsMetadataInput.encryptedDataCID),
101
+ encryptedSymmetricKey: kmsMetadataInput.encryptedSymmetricKey,
102
+ space: /** @type {Types.SpaceDID} */ (kmsMetadataInput.space),
103
+ kms: kmsMetadataInput.kms,
104
+ });
105
+ /**
106
+ * @param {Types.KMSMetadata} kmsMetadataInput
107
+ * @returns {Promise<import('@ucanto/interface').Block>}
108
+ */
109
+ export const archiveBlock = async (kmsMetadataInput) => {
110
+ const bytes = dagCBOR.encode({ [version]: kmsMetadataInput });
111
+ const digest = await sha256.digest(bytes);
112
+ const cid = Link.create(dagCBOR.code, digest);
113
+ return { cid, bytes };
114
+ };
115
+ /**
116
+ * @param {Types.KMSMetadata} kmsMetadata
117
+ * @returns {Promise<Types.Result<Uint8Array>>}
118
+ */
119
+ export const archive = async (kmsMetadata) => {
120
+ const block = await archiveBlock(kmsMetadata);
121
+ return ok(CAR.encode({ roots: [block] }));
122
+ };
123
+ /**
124
+ * @param {Uint8Array} archive
125
+ * @returns {Types.Result<Types.KMSMetadataView, Types.UnknownFormat>}
126
+ */
127
+ export const extract = (archive) => {
128
+ const { roots } = CAR.decode(archive);
129
+ if (!roots.length) {
130
+ return error(new UnknownFormat('missing root block'));
131
+ }
132
+ const { code } = roots[0].cid;
133
+ if (code !== dagCBOR.code) {
134
+ return error(new UnknownFormat(`unexpected root CID codec: 0x${code.toString(16)}`));
135
+ }
136
+ return view({ root: roots[0] });
137
+ };
138
+ /**
139
+ * @param {object} source
140
+ * @param {Types.IPLDBlock} source.root
141
+ * @returns {Types.Result<Types.KMSMetadataView, Types.UnknownFormat>}
142
+ */
143
+ export const view = ({ root }) => {
144
+ const value = dagCBOR.decode(root.bytes);
145
+ const [matchedVersion, kmsMetadataData] = KMSMetadataSchema.match(value);
146
+ switch (matchedVersion) {
147
+ case version: {
148
+ const kmsMetadata = create(
149
+ /** @type {Types.KMSMetadata}*/ (kmsMetadataData));
150
+ return ok(kmsMetadata);
151
+ }
152
+ default:
153
+ return error(new UnknownFormat(`unknown KMS metadata version: ${matchedVersion}`));
154
+ }
155
+ };
156
+ //# sourceMappingURL=kms-metadata.js.map
@@ -1,5 +1,5 @@
1
1
  export const version: "encrypted-metadata@0.1";
2
- export const EncryptedMetadataSchema: Schema.VariantSchema<{
2
+ export const LitMetadataSchema: Schema.VariantSchema<{
3
3
  "encrypted-metadata@0.1": Schema.StructSchema<{
4
4
  encryptedDataCID: Schema.Schema<Link.Link<unknown, number, number, 0 | 1>, any>;
5
5
  identityBoundCiphertext: Schema.Schema<Uint8Array<ArrayBufferLike>, unknown>;
@@ -7,22 +7,22 @@ export const EncryptedMetadataSchema: Schema.VariantSchema<{
7
7
  accessControlConditions: Schema.Schema<Schema.Dictionary<string, unknown>[], unknown>;
8
8
  }, unknown>;
9
9
  }, unknown>;
10
- export const EncryptedMetadataInputSchema: Schema.StructSchema<{
10
+ export const LitMetadataInputSchema: Schema.StructSchema<{
11
11
  encryptedDataCID: Schema.StringSchema<string, unknown>;
12
12
  identityBoundCiphertext: Schema.StringSchema<string, unknown>;
13
13
  plaintextKeyHash: Schema.StringSchema<string, unknown>;
14
14
  accessControlConditions: Schema.Schema<Schema.Dictionary<string, unknown>[], unknown>;
15
15
  }, unknown>;
16
- export function create(encryptedMetadataInput: Types.EncryptedMetadata | Types.EncryptedMetadataInput): Types.EncryptedMetadataView;
17
- export function toJSON(encryptedMetadata: Types.EncryptedMetadataView): Types.EncryptedMetadataInput;
18
- export function parse(encryptedMetadataInput: Types.EncryptedMetadataInput): Types.EncryptedMetadata;
19
- export function archiveBlock(encryptedMetadataInput: Types.EncryptedMetadata): Promise<import("@ucanto/interface").Block>;
20
- export function archive(encryptedMetadataInput: Types.EncryptedMetadata): Promise<Types.Result<Uint8Array>>;
21
- export function extract(archive: Uint8Array): Types.Result<Types.EncryptedMetadataView, Types.UnknownFormat>;
16
+ export function create(encryptedMetadataInput: Types.LitMetadata | Types.LitMetadataInput): Types.LitMetadataView;
17
+ export function toJSON(encryptedMetadata: Types.LitMetadataView): Types.LitMetadataInput;
18
+ export function parse(encryptedMetadataInput: Types.LitMetadataInput): Types.LitMetadata;
19
+ export function archiveBlock(encryptedMetadataInput: Types.LitMetadata): Promise<import("@ucanto/interface").Block>;
20
+ export function archive(encryptedMetadata: Types.LitMetadata): Promise<Types.Result<Uint8Array>>;
21
+ export function extract(archive: Uint8Array): Types.Result<Types.LitMetadataView, Types.UnknownFormat>;
22
22
  export function view({ root }: {
23
23
  root: Types.IPLDBlock;
24
- }): Types.Result<Types.EncryptedMetadataView, Types.UnknownFormat>;
24
+ }): Types.Result<Types.LitMetadataView, Types.UnknownFormat>;
25
25
  import * as Link from 'multiformats/link';
26
26
  import { Schema } from '@ucanto/core';
27
- import * as Types from '../types.js';
28
- //# sourceMappingURL=encrypted-metadata.d.ts.map
27
+ import * as Types from '../../types.js';
28
+ //# sourceMappingURL=lit-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lit-metadata.d.ts","sourceRoot":"","sources":["../../../src/core/metadata/lit-metadata.js"],"names":[],"mappings":"AAUA,sBAAuB,wBAAwB,CAAA;AAE/C;;;;;;;YAUE;AAEF;;;;;YAQE;AAmEK,+CAHI,KAAK,CAAC,WAAW,GAAC,KAAK,CAAC,gBAAgB,GACtC,KAAK,CAAC,eAAe,CAGgB;AAM3C,0CAHI,KAAK,CAAC,eAAe,GACnB,KAAK,CAAC,gBAAgB,CASjC;AAMK,8CAHI,KAAK,CAAC,gBAAgB,GACpB,KAAK,CAAC,WAAW,CAS5B;AAMK,qDAHI,KAAK,CAAC,WAAW,GACf,OAAO,CAAC,OAAO,mBAAmB,EAAE,KAAK,CAAC,CAOtD;AAMM,2CAHI,KAAK,CAAC,WAAW,GACf,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAK7C;AAMM,iCAHI,UAAU,GACR,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,aAAa,CAAC,CAiBpE;AAOM,+BAHJ;IAAgC,IAAI,EAA5B,KAAK,CAAC,SAAS;CACvB,GAAU,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,aAAa,CAAC,CAiBpE;sBA3LqB,mBAAmB;uBAEF,cAAc;uBAE9B,gBAAgB"}