e2ee-client-backend 0.1.1
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.
- package/LICENSE +202 -0
- package/README.md +94 -0
- package/dist/index.d.ts +408 -0
- package/dist/index.js +1026 -0
- package/dist/index.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapters/graphql.ts","../src/adapters/rest.ts","../src/encoding/base64.ts","../src/crypto/key-derivation.ts","../src/auth/password-auth-client.ts","../src/cache/loki-cache.ts","../src/crypto/aes-gcm-strategy.ts","../src/compat/legacy-json-blob.ts","../src/crypto/mlkem-aes-gcm-strategy.ts","../src/crypto/strategy-registry.ts","../src/crypto/types.ts","../src/external-e2ee/client.ts","../src/repositories/entity-repository.ts","../src/schemas/dashboard.ts","../src/schemas/integration.ts"],"names":["utf8ToBytes","cloneValue","remote"],"mappings":"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","file":"index.js","sourcesContent":["import type { CrudAdapter, GraphqlTransport } from \"./contracts\";\n\nexport type GraphqlOperationKind = \"mutation\" | \"query\";\n\nexport interface GraphqlExecutorInput<TVariables = Record<string, unknown>> {\n document: unknown;\n kind: GraphqlOperationKind;\n variables?: TVariables;\n}\n\nexport type GraphqlExecutor = <\n TResult,\n TVariables = Record<string, unknown>,\n>(\n input: GraphqlExecutorInput<TVariables>,\n) => Promise<TResult>;\n\nexport class FunctionGraphqlTransport implements GraphqlTransport {\n public constructor(private readonly executor: GraphqlExecutor) {}\n\n public mutate<TResult, TVariables = Record<string, unknown>>(\n document: unknown,\n variables?: TVariables,\n ): Promise<TResult> {\n return this.executor<TResult, TVariables>(\n variables === undefined\n ? {\n document,\n kind: \"mutation\",\n }\n : {\n document,\n kind: \"mutation\",\n variables,\n },\n );\n }\n\n public query<TResult, TVariables = Record<string, unknown>>(\n document: unknown,\n variables?: TVariables,\n ): Promise<TResult> {\n return this.executor<TResult, TVariables>(\n variables === undefined\n ? {\n document,\n kind: \"query\",\n }\n : {\n document,\n kind: \"query\",\n variables,\n },\n );\n }\n}\n\ntype VariablesFactory<TResult> =\n | Record<string, unknown>\n | ((result?: TResult) => Record<string, unknown> | undefined);\n\nfunction resolveVariables<TResult>(\n variables?: VariablesFactory<TResult>,\n result?: TResult,\n): Record<string, unknown> | undefined {\n if (!variables) {\n return undefined;\n }\n\n return typeof variables === \"function\" ? variables(result) : variables;\n}\n\nexport interface GraphqlCrudAdapterConfig<TRemote, TId = string> {\n create?: {\n buildVariables: (input: TRemote) => Record<string, unknown>;\n document: unknown;\n select: (result: unknown) => TRemote;\n };\n delete?: {\n buildVariables: (id: TId) => Record<string, unknown>;\n document: unknown;\n };\n getById?: {\n buildVariables: (id: TId) => Record<string, unknown>;\n document: unknown;\n select: (result: unknown) => TRemote | null;\n };\n list?: {\n document: unknown;\n select: (result: unknown) => TRemote[];\n variables?: VariablesFactory<TRemote[]>;\n };\n update?: {\n buildVariables: (id: TId, input: TRemote) => Record<string, unknown>;\n document: unknown;\n select: (result: unknown) => TRemote;\n };\n}\n\nexport class GraphqlCrudAdapter<TRemote, TId = string>\n implements CrudAdapter<TRemote, TId>\n{\n public constructor(\n private readonly transport: GraphqlTransport,\n private readonly config: GraphqlCrudAdapterConfig<TRemote, TId>,\n ) {}\n\n public async create(input: TRemote): Promise<TRemote> {\n const config = this.config.create;\n if (!config) {\n throw new Error(\"This GraphQL adapter does not implement create().\");\n }\n\n const result = await this.transport.mutate(\n config.document,\n config.buildVariables(input),\n );\n\n return config.select(result);\n }\n\n public async delete(id: TId): Promise<void> {\n const config = this.config.delete;\n if (!config) {\n throw new Error(\"This GraphQL adapter does not implement delete().\");\n }\n\n await this.transport.mutate(config.document, config.buildVariables(id));\n }\n\n public async getById(id: TId): Promise<TRemote | null> {\n const config = this.config.getById;\n if (!config) {\n throw new Error(\"This GraphQL adapter does not implement getById().\");\n }\n\n const result = await this.transport.query(\n config.document,\n config.buildVariables(id),\n );\n\n return config.select(result);\n }\n\n public async list(): Promise<TRemote[]> {\n const config = this.config.list;\n if (!config) {\n throw new Error(\"This GraphQL adapter does not implement list().\");\n }\n\n const result = await this.transport.query(\n config.document,\n resolveVariables(config.variables),\n );\n\n return config.select(result);\n }\n\n public async update(id: TId, input: TRemote): Promise<TRemote> {\n const config = this.config.update;\n if (!config) {\n throw new Error(\"This GraphQL adapter does not implement update().\");\n }\n\n const result = await this.transport.mutate(\n config.document,\n config.buildVariables(id, input),\n );\n\n return config.select(result);\n }\n}\n\nexport function createGraphqlTransport(\n executor: GraphqlExecutor,\n): FunctionGraphqlTransport {\n return new FunctionGraphqlTransport(executor);\n}","import type { CrudAdapter, RestRequest, RestTransport } from \"./contracts\";\n\nfunction identity<TValue>(value: TValue): TValue {\n return value;\n}\n\nfunction normalizeBaseUrl(baseUrl: string): string {\n return baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n}\n\nfunction resolvePath(path: string | (() => string)): string {\n return typeof path === \"function\" ? path() : path;\n}\n\nfunction withBody<TBody>(\n method: \"POST\" | \"PUT\",\n path: string,\n body: TBody | undefined,\n): RestRequest<TBody> {\n if (body === undefined) {\n return {\n method,\n path,\n };\n }\n\n return {\n body,\n method,\n path,\n };\n}\n\nexport interface FetchRestTransportOptions {\n baseUrl: string;\n defaultHeaders?: Record<string, string>;\n fetch?: typeof fetch;\n}\n\nexport class FetchRestTransport implements RestTransport {\n private readonly baseUrl: string;\n private readonly fetchImpl: typeof fetch;\n\n public constructor(private readonly options: FetchRestTransportOptions) {\n this.baseUrl = normalizeBaseUrl(options.baseUrl);\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n public async request<TResult, TBody = unknown>(\n request: RestRequest<TBody>,\n ): Promise<TResult> {\n const url = new URL(request.path.replace(/^\\//, \"\"), this.baseUrl);\n if (request.query) {\n for (const [key, value] of Object.entries(request.query)) {\n if (value === undefined || value === null) {\n continue;\n }\n url.searchParams.set(key, String(value));\n }\n }\n\n const headers = new Headers(this.options.defaultHeaders);\n if (request.headers) {\n for (const [key, value] of Object.entries(request.headers)) {\n headers.set(key, value);\n }\n }\n\n const init: RequestInit = {\n method: request.method,\n headers,\n };\n\n if (request.body !== undefined) {\n if (!headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json\");\n }\n init.body = JSON.stringify(request.body);\n }\n\n const response = await this.fetchImpl(url, init);\n if (!response.ok) {\n throw new Error(`REST request failed with ${response.status}.`);\n }\n\n if (response.status === 204) {\n return undefined as TResult;\n }\n\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n if (contentType.includes(\"application/json\")) {\n return (await response.json()) as TResult;\n }\n\n return (await response.text()) as TResult;\n }\n}\n\nexport interface RestCrudAdapterConfig<TRemote, TId = string> {\n create?: {\n path: string | (() => string);\n select?: (result: unknown) => TRemote;\n serialize?: (input: TRemote) => unknown;\n };\n delete?: {\n path: (id: TId) => string;\n };\n getById?: {\n path: (id: TId) => string;\n select?: (result: unknown) => TRemote | null;\n };\n list?: {\n path: string | (() => string);\n query?: Record<string, boolean | number | string | null | undefined>;\n select?: (result: unknown) => TRemote[];\n };\n update?: {\n path: (id: TId) => string;\n select?: (result: unknown) => TRemote;\n serialize?: (input: TRemote) => unknown;\n };\n}\n\nexport class RestCrudAdapter<TRemote, TId = string>\n implements CrudAdapter<TRemote, TId>\n{\n public constructor(\n private readonly transport: RestTransport,\n private readonly config: RestCrudAdapterConfig<TRemote, TId>,\n ) {}\n\n public async create(input: TRemote): Promise<TRemote> {\n const config = this.config.create;\n if (!config) {\n throw new Error(\"This REST adapter does not implement create().\");\n }\n\n const result = await this.transport.request({\n ...withBody(\n \"POST\",\n resolvePath(config.path),\n (config.serialize ?? identity)(input),\n ),\n });\n\n return (config.select ?? identity)(result as TRemote);\n }\n\n public async delete(id: TId): Promise<void> {\n const config = this.config.delete;\n if (!config) {\n throw new Error(\"This REST adapter does not implement delete().\");\n }\n\n await this.transport.request({\n method: \"DELETE\",\n path: config.path(id),\n });\n }\n\n public async getById(id: TId): Promise<TRemote | null> {\n const config = this.config.getById;\n if (!config) {\n throw new Error(\"This REST adapter does not implement getById().\");\n }\n\n const result = await this.transport.request({\n method: \"GET\",\n path: config.path(id),\n });\n\n return (config.select ?? identity)(result as TRemote | null);\n }\n\n public async list(): Promise<TRemote[]> {\n const config = this.config.list;\n if (!config) {\n throw new Error(\"This REST adapter does not implement list().\");\n }\n\n const result = await this.transport.request({\n method: \"GET\",\n path: resolvePath(config.path),\n ...(config.query ? { query: config.query } : {}),\n });\n\n return (config.select ?? identity)(result as TRemote[]);\n }\n\n public async update(id: TId, input: TRemote): Promise<TRemote> {\n const config = this.config.update;\n if (!config) {\n throw new Error(\"This REST adapter does not implement update().\");\n }\n\n const result = await this.transport.request({\n ...withBody(\n \"PUT\",\n config.path(id),\n (config.serialize ?? identity)(input),\n ),\n });\n\n return (config.select ?? identity)(result as TRemote);\n }\n}\n\nexport function createFetchRestTransport(\n options: FetchRestTransportOptions,\n): FetchRestTransport {\n return new FetchRestTransport(options);\n}","const encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nexport function toUint8Array(value: ArrayBuffer | ArrayBufferView): Uint8Array {\n if (value instanceof Uint8Array) {\n return value;\n }\n\n if (ArrayBuffer.isView(value)) {\n return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);\n }\n\n return new Uint8Array(value);\n}\n\nexport function toArrayBuffer(value: ArrayBuffer | ArrayBufferView): ArrayBuffer {\n const bytes = toUint8Array(value);\n return bytes.buffer.slice(\n bytes.byteOffset,\n bytes.byteOffset + bytes.byteLength,\n ) as ArrayBuffer;\n}\n\nexport function bytesToBase64(value: ArrayBuffer | ArrayBufferView): string {\n const bytes = toUint8Array(value);\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(bytes).toString(\"base64\");\n }\n\n let binary = \"\";\n for (const byte of bytes) {\n binary += String.fromCodePoint(byte);\n }\n return btoa(binary);\n}\n\nexport function base64ToBytes(base64: string): Uint8Array {\n if (typeof Buffer !== \"undefined\") {\n return new Uint8Array(Buffer.from(base64, \"base64\"));\n }\n\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.codePointAt(index) ?? 0;\n }\n return bytes;\n}\n\nexport function utf8ToBytes(value: string): Uint8Array {\n return encoder.encode(value);\n}\n\nexport function bytesToUtf8(value: ArrayBuffer | ArrayBufferView): string {\n return decoder.decode(toUint8Array(value));\n}","import { hkdf } from \"@noble/hashes/hkdf.js\";\nimport { scryptAsync } from \"@noble/hashes/scrypt.js\";\nimport { sha256 } from \"@noble/hashes/sha2.js\";\nimport { bytesToHex, utf8ToBytes } from \"@noble/hashes/utils.js\";\nimport { base64ToBytes } from \"../encoding/base64\";\n\nconst AUTH_INFO = utf8ToBytes(\"dashboard.auth.v1\");\n\nexport const DEFAULT_SCRYPT_PARAMS = {\n N: 1 << 15,\n r: 8,\n p: 1,\n dkLen: 32,\n maxmem: 128 * 1024 * 1024,\n} as const;\n\nexport function kdfSaltFromBase64(kdfSaltBase64: string): Uint8Array {\n return base64ToBytes(kdfSaltBase64.trim());\n}\n\nexport async function deriveAes256KeyFromPassword(\n password: string,\n salt: Uint8Array,\n): Promise<Uint8Array> {\n return scryptAsync(utf8ToBytes(password), salt, DEFAULT_SCRYPT_PARAMS);\n}\n\nexport function deriveAuthKeyMaterial(kEnc: Uint8Array): Uint8Array {\n return hkdf(sha256, kEnc, new Uint8Array(0), AUTH_INFO, 32);\n}\n\nexport async function deriveClientKeyMaterial(\n password: string,\n kdfSaltBase64: string,\n): Promise<{ kAuthHex: string; kEnc: Uint8Array }> {\n const salt = kdfSaltFromBase64(kdfSaltBase64);\n const kEnc = await deriveAes256KeyFromPassword(password, salt);\n return {\n kAuthHex: bytesToHex(deriveAuthKeyMaterial(kEnc)),\n kEnc,\n };\n}\n\nexport async function authKeyMaterialHex(\n password: string,\n kdfSaltBase64: string,\n): Promise<string> {\n const { kAuthHex } = await deriveClientKeyMaterial(password, kdfSaltBase64);\n return kAuthHex;\n}","import { deriveClientKeyMaterial } from \"../crypto/key-derivation\";\n\nexport interface PasswordAuthResult<TUser> {\n message?: string | null;\n ok: boolean;\n user?: TUser | null;\n}\n\nexport interface PasswordAuthAdapter<TUser> {\n getKdfSalt(email: string): Promise<string>;\n login(\n email: string,\n authKeyMaterialHex: string,\n ): Promise<PasswordAuthResult<TUser>>;\n logout(): Promise<boolean | void>;\n refresh(): Promise<PasswordAuthResult<TUser>>;\n registerBegin(email: string): Promise<{ kdfSaltBase64: string }>;\n registerComplete(\n email: string,\n authKeyMaterialHex: string,\n ): Promise<PasswordAuthResult<TUser>>;\n}\n\nexport interface PasswordAuthAttempt<TUser> {\n kAuthHex: string;\n kEnc: Uint8Array;\n normalizedEmail: string;\n result: PasswordAuthResult<TUser>;\n}\n\nexport function normalizeAuthEmail(email: string): string {\n return email.trim().toLowerCase();\n}\n\nexport class PasswordAuthClient<TUser> {\n public constructor(private readonly adapter: PasswordAuthAdapter<TUser>) {}\n\n public async beginRegistration(email: string): Promise<string> {\n const response = await this.adapter.registerBegin(normalizeAuthEmail(email));\n return response.kdfSaltBase64;\n }\n\n public async completeRegistrationWithPassword(\n email: string,\n password: string,\n kdfSaltBase64: string,\n ): Promise<PasswordAuthAttempt<TUser>> {\n const normalizedEmail = normalizeAuthEmail(email);\n const { kAuthHex, kEnc } = await deriveClientKeyMaterial(\n password,\n kdfSaltBase64,\n );\n return {\n kAuthHex,\n kEnc,\n normalizedEmail,\n result: await this.adapter.registerComplete(normalizedEmail, kAuthHex),\n };\n }\n\n public async loginWithPassword(\n email: string,\n password: string,\n ): Promise<PasswordAuthAttempt<TUser>> {\n const normalizedEmail = normalizeAuthEmail(email);\n const kdfSaltBase64 = await this.adapter.getKdfSalt(normalizedEmail);\n const { kAuthHex, kEnc } = await deriveClientKeyMaterial(\n password,\n kdfSaltBase64,\n );\n return {\n kAuthHex,\n kEnc,\n normalizedEmail,\n result: await this.adapter.login(normalizedEmail, kAuthHex),\n };\n }\n\n public logout(): Promise<boolean | void> {\n return this.adapter.logout();\n }\n\n public refreshSession(): Promise<PasswordAuthResult<TUser>> {\n return this.adapter.refresh();\n }\n\n public async registerWithPassword(\n email: string,\n password: string,\n ): Promise<PasswordAuthAttempt<TUser>> {\n const kdfSaltBase64 = await this.beginRegistration(email);\n return this.completeRegistrationWithPassword(email, password, kdfSaltBase64);\n }\n}\n\nexport function createPasswordAuthClient<TUser>(\n adapter: PasswordAuthAdapter<TUser>,\n): PasswordAuthClient<TUser> {\n return new PasswordAuthClient(adapter);\n}","import Loki from \"lokijs\";\nimport type { Collection } from \"lokijs\";\n\ntype CacheEntry<TValue> = {\n id: string;\n updatedAt: number;\n value: TValue;\n};\n\nfunction cloneValue<TValue>(value: TValue): TValue {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (typeof value !== \"object\") {\n return value;\n }\n\n return structuredClone(value);\n}\n\nexport interface CacheStore<TEntity, TId = string> {\n clear(): void;\n clearCollection(collectionName: string): void;\n get(collectionName: string, id: TId): TEntity | null;\n list(collectionName: string): TEntity[];\n put(collectionName: string, id: TId, value: TEntity): void;\n remove(collectionName: string, id: TId): void;\n}\n\nexport class LokiCacheStore<TEntity, TId = string>\n implements CacheStore<TEntity, TId>\n{\n private readonly collections = new Map<string, Collection<CacheEntry<TEntity>>>();\n private readonly db = new Loki(\"e2ee-client-backend\", {\n autoload: false,\n autosave: false,\n persistenceMethod: \"memory\",\n });\n\n public clear(): void {\n for (const name of this.collections.keys()) {\n this.clearCollection(name);\n }\n }\n\n public clearCollection(collectionName: string): void {\n this.collections.delete(collectionName);\n if (this.db.getCollection(collectionName)) {\n this.db.removeCollection(collectionName);\n }\n }\n\n public get(collectionName: string, id: TId): TEntity | null {\n const collection = this.ensureCollection(collectionName);\n const entry = collection.findOne({ id: String(id) });\n return entry ? cloneValue(entry.value) : null;\n }\n\n public list(collectionName: string): TEntity[] {\n const collection = this.ensureCollection(collectionName);\n return collection\n .chain()\n .simplesort(\"updatedAt\")\n .data()\n .map((entry) => cloneValue(entry.value));\n }\n\n public put(collectionName: string, id: TId, value: TEntity): void {\n const collection = this.ensureCollection(collectionName);\n const normalizedId = String(id);\n const existing = collection.findOne({ id: normalizedId });\n\n if (existing) {\n existing.updatedAt = Date.now();\n existing.value = cloneValue(value);\n collection.update(existing);\n return;\n }\n\n collection.insert({\n id: normalizedId,\n updatedAt: Date.now(),\n value: cloneValue(value),\n });\n }\n\n public remove(collectionName: string, id: TId): void {\n const collection = this.ensureCollection(collectionName);\n const existing = collection.findOne({ id: String(id) });\n if (existing) {\n collection.remove(existing);\n }\n }\n\n private ensureCollection(collectionName: string): Collection<CacheEntry<TEntity>> {\n const existing = this.collections.get(collectionName);\n if (existing) {\n return existing;\n }\n\n const created = this.db.addCollection<CacheEntry<TEntity>>(collectionName, {\n indices: [\"updatedAt\"],\n unique: [\"id\"],\n });\n this.collections.set(collectionName, created);\n return created;\n }\n}\n\nexport function createLokiCacheStore<TEntity, TId = string>(): LokiCacheStore<\n TEntity,\n TId\n> {\n return new LokiCacheStore<TEntity, TId>();\n}","import { bytesToBase64, base64ToBytes, toArrayBuffer } from \"../encoding/base64\";\nimport type { EncryptionStrategy } from \"./types\";\n\nexport interface Aes256GcmContext {\n additionalData?: Uint8Array;\n key: Uint8Array;\n}\n\nexport class Aes256GcmStrategy\n implements EncryptionStrategy<Aes256GcmContext, Aes256GcmContext>\n{\n public readonly id = \"aes-256-gcm\";\n public readonly nonceLength = 12;\n\n public async encrypt(\n plaintext: Uint8Array,\n context: Aes256GcmContext,\n ) {\n const key = await this.importKey(context.key);\n const nonce = crypto.getRandomValues(new Uint8Array(this.nonceLength));\n const params: AesGcmParams = {\n iv: toArrayBuffer(nonce),\n name: \"AES-GCM\",\n };\n\n if (context.additionalData) {\n params.additionalData = toArrayBuffer(context.additionalData);\n }\n\n const ciphertext = await crypto.subtle.encrypt(\n params,\n key,\n toArrayBuffer(plaintext),\n );\n\n return {\n version: 1 as const,\n algorithm: this.id,\n ciphertextBase64: bytesToBase64(ciphertext),\n nonceBase64: bytesToBase64(nonce),\n };\n }\n\n public async decrypt(payload: { ciphertextBase64: string; nonceBase64?: string }, context: Aes256GcmContext) {\n if (!payload.nonceBase64) {\n throw new Error(\"AES-GCM payload is missing nonceBase64.\");\n }\n\n const key = await this.importKey(context.key);\n const params: AesGcmParams = {\n iv: toArrayBuffer(base64ToBytes(payload.nonceBase64)),\n name: \"AES-GCM\",\n };\n\n if (context.additionalData) {\n params.additionalData = toArrayBuffer(context.additionalData);\n }\n\n const plaintext = await crypto.subtle.decrypt(\n params,\n key,\n toArrayBuffer(base64ToBytes(payload.ciphertextBase64)),\n );\n\n return new Uint8Array(plaintext);\n }\n\n private async importKey(keyBytes: Uint8Array): Promise<CryptoKey> {\n if (keyBytes.length !== 32) {\n throw new Error(\"AES-256-GCM expects a 32-byte key.\");\n }\n\n return crypto.subtle.importKey(\n \"raw\",\n toArrayBuffer(keyBytes),\n \"AES-GCM\",\n false,\n [\"encrypt\", \"decrypt\"],\n );\n }\n}\n\nexport function createAes256GcmStrategy(): Aes256GcmStrategy {\n return new Aes256GcmStrategy();\n}","import { createAes256GcmStrategy } from \"../crypto/aes-gcm-strategy\";\nimport type { EncryptedFieldValue } from \"../crypto/types\";\nimport { bytesToUtf8, utf8ToBytes } from \"../encoding/base64\";\n\nexport interface LegacyEncryptedJsonBlob {\n ciphertextBase64: string;\n nonceBase64: string;\n}\n\nconst legacyAesStrategy = createAes256GcmStrategy();\n\nexport async function decryptJsonFromLegacyBlob<TValue>(\n blob: LegacyEncryptedJsonBlob,\n key: Uint8Array,\n): Promise<TValue> {\n const plaintext = await legacyAesStrategy.decrypt(\n legacyBlobToEncryptedField(blob),\n { key },\n );\n return JSON.parse(bytesToUtf8(plaintext)) as TValue;\n}\n\nexport function encryptedFieldToLegacyBlob(\n payload: EncryptedFieldValue,\n): LegacyEncryptedJsonBlob {\n if (!payload.nonceBase64) {\n throw new Error(\"Legacy blob conversion requires nonceBase64.\");\n }\n\n return {\n ciphertextBase64: payload.ciphertextBase64,\n nonceBase64: payload.nonceBase64,\n };\n}\n\nexport async function encryptJsonToLegacyBlob<TValue>(\n value: TValue,\n key: Uint8Array,\n): Promise<LegacyEncryptedJsonBlob> {\n const payload = await legacyAesStrategy.encrypt(\n utf8ToBytes(JSON.stringify(value)),\n { key },\n );\n return encryptedFieldToLegacyBlob(payload);\n}\n\nexport function legacyBlobToEncryptedField(\n blob: LegacyEncryptedJsonBlob,\n algorithm = \"aes-256-gcm\",\n): EncryptedFieldValue {\n return {\n algorithm,\n ciphertextBase64: blob.ciphertextBase64,\n nonceBase64: blob.nonceBase64,\n version: 1,\n };\n}","import mlkem from \"mlkem-wasm\";\nimport { base64ToBytes, bytesToBase64, toArrayBuffer } from \"../encoding/base64\";\nimport type { EncryptionStrategy } from \"./types\";\n\nconst ML_KEM_ALGORITHM = { name: \"ML-KEM-768\" } as const;\nconst SHARED_KEY_ALGORITHM = { name: \"AES-GCM\", length: 256 } as const;\n\nexport interface MlKemAes256GcmEncryptContext {\n additionalData?: Uint8Array;\n recipientPublicKey: Uint8Array;\n}\n\nexport interface MlKemAes256GcmDecryptContext {\n additionalData?: Uint8Array;\n recipientPrivateKey: Uint8Array;\n}\n\nexport interface MlKemKeyPair {\n privateKeySeed: Uint8Array;\n publicKey: Uint8Array;\n}\n\nasync function importPublicKey(publicKey: Uint8Array): Promise<CryptoKey> {\n return mlkem.importKey(\n \"raw-public\",\n toArrayBuffer(publicKey),\n ML_KEM_ALGORITHM,\n false,\n [\"encapsulateKey\"],\n );\n}\n\nasync function importPrivateKey(privateKeySeed: Uint8Array): Promise<CryptoKey> {\n return mlkem.importKey(\n \"raw-seed\",\n toArrayBuffer(privateKeySeed),\n ML_KEM_ALGORITHM,\n false,\n [\"decapsulateKey\"],\n );\n}\n\nexport async function generateMlKemKeyPair(): Promise<MlKemKeyPair> {\n const { privateKey, publicKey } = await mlkem.generateKey(ML_KEM_ALGORITHM, true, [\n \"encapsulateKey\",\n \"decapsulateKey\",\n ]);\n\n const exportedPublicKey = await mlkem.exportKey(\"raw-public\", publicKey);\n const exportedPrivateKeySeed = await mlkem.exportKey(\"raw-seed\", privateKey);\n\n return {\n publicKey: new Uint8Array(exportedPublicKey),\n privateKeySeed: new Uint8Array(exportedPrivateKeySeed),\n };\n}\n\nexport class MlKemAes256GcmStrategy\n implements\n EncryptionStrategy<\n MlKemAes256GcmEncryptContext,\n MlKemAes256GcmDecryptContext\n >\n{\n public readonly id = \"ml-kem-768-aes-256-gcm\";\n public readonly nonceLength = 12;\n\n public async encrypt(\n plaintext: Uint8Array,\n context: MlKemAes256GcmEncryptContext,\n ) {\n const recipientPublicKey = await importPublicKey(context.recipientPublicKey);\n const encapsulated = await mlkem.encapsulateKey(\n ML_KEM_ALGORITHM,\n recipientPublicKey,\n SHARED_KEY_ALGORITHM,\n false,\n [\"encrypt\", \"decrypt\"],\n );\n const nonce = crypto.getRandomValues(new Uint8Array(this.nonceLength));\n const params: AesGcmParams = {\n iv: toArrayBuffer(nonce),\n name: \"AES-GCM\",\n };\n\n if (context.additionalData) {\n params.additionalData = toArrayBuffer(context.additionalData);\n }\n\n const ciphertext = await crypto.subtle.encrypt(\n params,\n encapsulated.sharedKey,\n toArrayBuffer(plaintext),\n );\n\n return {\n version: 1 as const,\n algorithm: this.id,\n ciphertextBase64: bytesToBase64(ciphertext),\n nonceBase64: bytesToBase64(nonce),\n encapsulatedKeyCiphertextBase64: bytesToBase64(encapsulated.ciphertext),\n metadata: {\n kem: \"ML-KEM-768\",\n },\n };\n }\n\n public async decrypt(\n payload: {\n ciphertextBase64: string;\n encapsulatedKeyCiphertextBase64?: string;\n nonceBase64?: string;\n },\n context: MlKemAes256GcmDecryptContext,\n ): Promise<Uint8Array> {\n if (!payload.nonceBase64) {\n throw new Error(\"ML-KEM AES payload is missing nonceBase64.\");\n }\n\n if (!payload.encapsulatedKeyCiphertextBase64) {\n throw new Error(\n \"ML-KEM AES payload is missing encapsulatedKeyCiphertextBase64.\",\n );\n }\n\n const recipientPrivateKey = await importPrivateKey(context.recipientPrivateKey);\n const sharedKey = await mlkem.decapsulateKey(\n ML_KEM_ALGORITHM,\n recipientPrivateKey,\n toArrayBuffer(base64ToBytes(payload.encapsulatedKeyCiphertextBase64)),\n SHARED_KEY_ALGORITHM,\n false,\n [\"decrypt\"],\n );\n const params: AesGcmParams = {\n iv: toArrayBuffer(base64ToBytes(payload.nonceBase64)),\n name: \"AES-GCM\",\n };\n\n if (context.additionalData) {\n params.additionalData = toArrayBuffer(context.additionalData);\n }\n\n const plaintext = await crypto.subtle.decrypt(\n params,\n sharedKey,\n toArrayBuffer(base64ToBytes(payload.ciphertextBase64)),\n );\n\n return new Uint8Array(plaintext);\n }\n}\n\nexport function createMlKemAes256GcmStrategy(): MlKemAes256GcmStrategy {\n return new MlKemAes256GcmStrategy();\n}","import type { EncryptedFieldValue, EncryptionStrategy } from \"./types\";\n\nexport class StrategyRegistry {\n private readonly strategies = new Map<string, EncryptionStrategy<any, any>>();\n\n public constructor(strategies: EncryptionStrategy<any, any>[] = []) {\n for (const strategy of strategies) {\n this.register(strategy);\n }\n }\n\n public register(strategy: EncryptionStrategy<any, any>): void {\n this.strategies.set(strategy.id, strategy);\n }\n\n public get<TEncryptContext, TDecryptContext>(\n id: string,\n ): EncryptionStrategy<TEncryptContext, TDecryptContext> {\n const strategy = this.strategies.get(id);\n if (!strategy) {\n throw new Error(`No encryption strategy registered for \"${id}\".`);\n }\n\n return strategy as EncryptionStrategy<TEncryptContext, TDecryptContext>;\n }\n\n public encrypt<TEncryptContext>(\n id: string,\n plaintext: Uint8Array,\n context: TEncryptContext,\n ): Promise<EncryptedFieldValue> {\n return this.get<TEncryptContext, never>(id).encrypt(plaintext, context);\n }\n\n public decrypt<TDecryptContext>(\n payload: EncryptedFieldValue,\n context: TDecryptContext,\n ): Promise<Uint8Array> {\n return this.get<never, TDecryptContext>(payload.algorithm).decrypt(\n payload,\n context,\n );\n }\n}\n\nexport function createStrategyRegistry(\n ...strategies: EncryptionStrategy<any, any>[]\n): StrategyRegistry {\n return new StrategyRegistry(strategies);\n}","export type EncryptionAlgorithmId =\n | \"aes-256-gcm\"\n | \"ml-kem-768-aes-256-gcm\";\n\nexport type EncryptedFieldMetadata = Record<\n string,\n boolean | number | string | null\n>;\n\nexport interface EncryptedFieldValue {\n version: 1;\n algorithm: string;\n ciphertextBase64: string;\n nonceBase64?: string;\n encapsulatedKeyCiphertextBase64?: string;\n metadata?: EncryptedFieldMetadata;\n}\n\nexport interface EncryptionStrategy<\n TEncryptContext = unknown,\n TDecryptContext = TEncryptContext,\n> {\n readonly id: string;\n encrypt(\n plaintext: Uint8Array,\n context: TEncryptContext,\n ): Promise<EncryptedFieldValue>;\n decrypt(\n payload: EncryptedFieldValue,\n context: TDecryptContext,\n ): Promise<Uint8Array>;\n}\n\nexport function isEncryptedFieldValue(value: unknown): value is EncryptedFieldValue {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n\n const candidate = value as Partial<EncryptedFieldValue>;\n return (\n candidate.version === 1 &&\n typeof candidate.algorithm === \"string\" &&\n typeof candidate.ciphertextBase64 === \"string\"\n );\n}","export interface ExternalE2eeApiProvider<\n TConfig,\n TSession,\n TProject,\n TTask,\n TProjectQuery = undefined,\n TTaskQuery = undefined,\n> {\n authenticate(config: TConfig): Promise<TSession>;\n listProjects(\n config: TConfig,\n session: TSession,\n query?: TProjectQuery,\n ): Promise<TProject[]>;\n listTasks(\n config: TConfig,\n session: TSession,\n query?: TTaskQuery,\n ): Promise<TTask[]>;\n validateAccess?(config: TConfig, session: TSession): Promise<void>;\n}\n\nexport class ExternalE2eeApiClient<\n TConfig,\n TSession,\n TProject,\n TTask,\n TProjectQuery = undefined,\n TTaskQuery = undefined,\n> {\n public constructor(\n private readonly provider: ExternalE2eeApiProvider<\n TConfig,\n TSession,\n TProject,\n TTask,\n TProjectQuery,\n TTaskQuery\n >,\n ) {}\n\n public authenticate(config: TConfig): Promise<TSession> {\n return this.provider.authenticate(config);\n }\n\n public async ensureAccess(config: TConfig): Promise<void> {\n const session = await this.provider.authenticate(config);\n if (this.provider.validateAccess) {\n await this.provider.validateAccess(config, session);\n }\n }\n\n public async listProjects(\n config: TConfig,\n query?: TProjectQuery,\n ): Promise<TProject[]> {\n const session = await this.provider.authenticate(config);\n return this.provider.listProjects(config, session, query);\n }\n\n public async listTasks(config: TConfig, query?: TTaskQuery): Promise<TTask[]> {\n const session = await this.provider.authenticate(config);\n return this.provider.listTasks(config, session, query);\n }\n}\n\nexport function createExternalE2eeApiClient<\n TConfig,\n TSession,\n TProject,\n TTask,\n TProjectQuery = undefined,\n TTaskQuery = undefined,\n>(\n provider: ExternalE2eeApiProvider<\n TConfig,\n TSession,\n TProject,\n TTask,\n TProjectQuery,\n TTaskQuery\n >,\n): ExternalE2eeApiClient<\n TConfig,\n TSession,\n TProject,\n TTask,\n TProjectQuery,\n TTaskQuery\n> {\n return new ExternalE2eeApiClient(provider);\n}","import type { CrudAdapter } from \"../adapters/contracts\";\nimport type { CacheStore } from \"../cache/loki-cache\";\nimport { StrategyRegistry } from \"../crypto/strategy-registry\";\nimport {\n type EncryptedFieldValue,\n isEncryptedFieldValue,\n} from \"../crypto/types\";\nimport { bytesToUtf8, utf8ToBytes } from \"../encoding/base64\";\n\ntype JsonObject = Record<string, unknown>;\n\nfunction cloneValue<TValue>(value: TValue): TValue {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (typeof value !== \"object\") {\n return value;\n }\n\n return structuredClone(value);\n}\n\nfunction getByPath(target: JsonObject, path: string): unknown {\n return path.split(\".\").reduce<unknown>((current, segment) => {\n if (!current || typeof current !== \"object\") {\n return undefined;\n }\n\n return (current as JsonObject)[segment];\n }, target);\n}\n\nfunction setByPath(target: JsonObject, path: string, value: unknown): void {\n const segments = path.split(\".\");\n const lastSegment = segments.at(-1);\n if (!lastSegment) {\n return;\n }\n\n let current: JsonObject = target;\n for (const segment of segments.slice(0, -1)) {\n const existing = current[segment];\n if (!existing || typeof existing !== \"object\" || Array.isArray(existing)) {\n current[segment] = {};\n }\n current = current[segment] as JsonObject;\n }\n\n current[lastSegment] = value;\n}\n\nfunction deleteByPath(target: JsonObject, path: string): void {\n const segments = path.split(\".\");\n const lastSegment = segments.at(-1);\n if (!lastSegment) {\n return;\n }\n\n let current: JsonObject = target;\n for (const segment of segments.slice(0, -1)) {\n const next = current[segment];\n if (!next || typeof next !== \"object\" || Array.isArray(next)) {\n return;\n }\n current = next as JsonObject;\n }\n\n delete current[lastSegment];\n}\n\nfunction stringifyValue(value: unknown): Uint8Array {\n return utf8ToBytes(JSON.stringify(value));\n}\n\nfunction parseValue(bytes: Uint8Array): unknown {\n return JSON.parse(bytesToUtf8(bytes));\n}\n\nexport interface FieldPolicy<TEntity, TRemote> {\n deserialize?: (value: unknown, remote: TRemote) => unknown;\n encrypted?: boolean;\n entityPath: string;\n remotePath?: string;\n serialize?: (value: unknown, entity: TEntity) => unknown;\n strategyId?: string;\n}\n\nexport interface EntitySchema<TEntity, TRemote, TId = string> {\n cacheCollection?: string;\n createEntity(remote: TRemote): TEntity;\n createRemote(entity: TEntity): TRemote;\n defaultStrategyId?: string;\n fields: FieldPolicy<TEntity, TRemote>[];\n idPath?: string;\n name: string;\n}\n\nexport interface StrategyContextResolver<TEntity, TRemote> {\n resolve(args: {\n entity?: TEntity;\n field: FieldPolicy<TEntity, TRemote>;\n payload?: EncryptedFieldValue;\n phase: \"decrypt\" | \"encrypt\";\n remote?: TRemote;\n schema: EntitySchema<TEntity, TRemote, any>;\n }): Promise<unknown>;\n}\n\nexport interface RepositoryReadOptions {\n cacheMode?: \"cache-first\" | \"network-first\" | \"no-cache\";\n}\n\nexport interface EntityRepositoryOptions<TEntity, TRemote, TId = string> {\n adapter: CrudAdapter<TRemote, TId>;\n cache?: CacheStore<TEntity, TId>;\n contextResolver: StrategyContextResolver<TEntity, TRemote>;\n schema: EntitySchema<TEntity, TRemote, TId>;\n strategies: StrategyRegistry;\n}\n\nexport class EntityRepository<TEntity, TRemote, TId = string> {\n private readonly cacheCollection: string;\n private readonly idPath: string;\n\n public constructor(private readonly options: EntityRepositoryOptions<TEntity, TRemote, TId>) {\n this.cacheCollection = options.schema.cacheCollection ?? options.schema.name;\n this.idPath = options.schema.idPath ?? \"id\";\n }\n\n public async create(entity: TEntity): Promise<TEntity> {\n const remote = await this.serializeEntity(entity);\n const created = await this.options.adapter.create(remote);\n return this.hydrateRemote(created, true);\n }\n\n public async delete(id: TId): Promise<void> {\n await this.options.adapter.delete(id);\n this.options.cache?.remove(this.cacheCollection, id);\n }\n\n public async getById(\n id: TId,\n options: RepositoryReadOptions = {},\n ): Promise<TEntity | null> {\n const cacheMode = options.cacheMode ?? \"network-first\";\n if (cacheMode === \"cache-first\") {\n const cached = this.options.cache?.get(this.cacheCollection, id) ?? null;\n if (cached) {\n return cached;\n }\n }\n\n if (cacheMode === \"no-cache\") {\n const remote = await this.options.adapter.getById(id);\n return remote ? this.hydrateRemote(remote, false) : null;\n }\n\n const remote = await this.options.adapter.getById(id);\n return remote ? this.hydrateRemote(remote, true) : null;\n }\n\n public async list(options: RepositoryReadOptions = {}): Promise<TEntity[]> {\n const cacheMode = options.cacheMode ?? \"network-first\";\n if (cacheMode === \"cache-first\") {\n const cached = this.options.cache?.list(this.cacheCollection) ?? [];\n if (cached.length > 0) {\n return cached;\n }\n }\n\n const remoteItems = await this.options.adapter.list();\n const items = await Promise.all(\n remoteItems.map((remote) => this.hydrateRemote(remote, cacheMode !== \"no-cache\")),\n );\n\n if (cacheMode !== \"no-cache\" && this.options.cache) {\n this.options.cache.clearCollection(this.cacheCollection);\n for (const entity of items) {\n this.options.cache.put(\n this.cacheCollection,\n this.resolveEntityId(entity),\n entity,\n );\n }\n }\n\n return items;\n }\n\n public async update(id: TId, entity: TEntity): Promise<TEntity> {\n const remote = await this.serializeEntity(entity);\n const updated = await this.options.adapter.update(id, remote);\n return this.hydrateRemote(updated, true);\n }\n\n private async hydrateRemote(remote: TRemote, storeInCache: boolean): Promise<TEntity> {\n const workingRemote = cloneValue(remote) as JsonObject;\n\n for (const field of this.options.schema.fields) {\n await this.hydrateField(remote, workingRemote, field);\n }\n\n const entity = this.options.schema.createEntity(workingRemote as TRemote);\n if (storeInCache && this.options.cache) {\n this.options.cache.put(\n this.cacheCollection,\n this.resolveEntityId(entity),\n entity,\n );\n }\n\n return entity;\n }\n\n private resolveEntityId(entity: TEntity): TId {\n return getByPath(entity as JsonObject, this.idPath) as TId;\n }\n\n private async hydrateField(\n remote: TRemote,\n workingRemote: JsonObject,\n field: FieldPolicy<TEntity, TRemote>,\n ): Promise<void> {\n const remotePath = field.remotePath ?? field.entityPath;\n const currentValue = getByPath(workingRemote, remotePath);\n\n if (field.encrypted) {\n if (currentValue === null || currentValue === undefined) {\n return;\n }\n\n if (!isEncryptedFieldValue(currentValue)) {\n throw new Error(\n `Field \"${remotePath}\" on entity \"${this.options.schema.name}\" is not an encrypted payload.`,\n );\n }\n\n const context = await this.options.contextResolver.resolve({\n field,\n payload: currentValue,\n phase: \"decrypt\",\n remote,\n schema: this.options.schema,\n });\n const plaintext = await this.options.strategies.decrypt(currentValue, context);\n const parsed = parseValue(plaintext);\n const nextValue = field.deserialize ? field.deserialize(parsed, remote) : parsed;\n setByPath(workingRemote, remotePath, nextValue);\n return;\n }\n\n if (field.deserialize) {\n setByPath(workingRemote, remotePath, field.deserialize(currentValue, remote));\n }\n }\n\n private async serializeEntity(entity: TEntity): Promise<TRemote> {\n const remote = cloneValue(this.options.schema.createRemote(entity)) as JsonObject;\n\n for (const field of this.options.schema.fields) {\n const entityValue = getByPath(entity as JsonObject, field.entityPath);\n const remotePath = field.remotePath ?? field.entityPath;\n const serializedValue = field.serialize\n ? field.serialize(entityValue, entity)\n : cloneValue(entityValue);\n\n if (serializedValue === undefined) {\n deleteByPath(remote, remotePath);\n continue;\n }\n\n if (field.encrypted) {\n const strategyId = field.strategyId ?? this.options.schema.defaultStrategyId;\n if (!strategyId) {\n throw new Error(\n `Field \"${field.entityPath}\" requires an encryption strategy, but none was configured.`,\n );\n }\n\n const context = await this.options.contextResolver.resolve({\n entity,\n field,\n phase: \"encrypt\",\n remote: remote as TRemote,\n schema: this.options.schema,\n });\n const payload = await this.options.strategies.encrypt(\n strategyId,\n stringifyValue(serializedValue),\n context,\n );\n setByPath(remote, remotePath, payload);\n continue;\n }\n\n setByPath(remote, remotePath, serializedValue);\n }\n\n return remote as TRemote;\n }\n}\n\nexport function createEntityRepository<TEntity, TRemote, TId = string>(\n options: EntityRepositoryOptions<TEntity, TRemote, TId>,\n): EntityRepository<TEntity, TRemote, TId> {\n return new EntityRepository(options);\n}","import type { EncryptedFieldValue } from \"../crypto/types\";\nimport type { EntitySchema } from \"../repositories/entity-repository\";\n\nexport interface DashboardEntity<TConfig = Record<string, unknown>> {\n config: TConfig | null;\n createdAt: string;\n id: string;\n name: string;\n updatedAt: string;\n}\n\nexport interface DashboardRemoteRecord<TConfig = Record<string, unknown>> {\n configEnvelope: EncryptedFieldValue | TConfig | null;\n createdAt: string;\n id: string;\n name: string;\n updatedAt: string;\n}\n\nexport function createDashboardSchema<TConfig = Record<string, unknown>>(\n strategyId = \"aes-256-gcm\",\n): EntitySchema<DashboardEntity<TConfig>, DashboardRemoteRecord<TConfig>, string> {\n return {\n cacheCollection: \"dashboards\",\n createEntity(remote) {\n return {\n config: (remote.configEnvelope as TConfig | null) ?? null,\n createdAt: remote.createdAt,\n id: remote.id,\n name: remote.name,\n updatedAt: remote.updatedAt,\n };\n },\n createRemote(entity) {\n return {\n configEnvelope: entity.config,\n createdAt: entity.createdAt,\n id: entity.id,\n name: entity.name,\n updatedAt: entity.updatedAt,\n };\n },\n defaultStrategyId: strategyId,\n fields: [\n {\n encrypted: true,\n entityPath: \"config\",\n remotePath: \"configEnvelope\",\n },\n ],\n name: \"dashboard\",\n };\n}","import type { EncryptedFieldValue } from \"../crypto/types\";\nimport type { EntitySchema } from \"../repositories/entity-repository\";\n\ntype IntegrationRemoteFieldValue = EncryptedFieldValue | string | null;\n\nexport interface IntegrationEntity {\n apiUrl: string;\n authHash: string | null;\n credentialMode: string;\n displayName: string;\n encryptionKey: string | null;\n id: string;\n lastSyncedAt: string | null;\n provider: string;\n providerSecret: string | null;\n status: string;\n username: string;\n}\n\nexport interface IntegrationRemoteRecord {\n apiUrl: string;\n authHash: IntegrationRemoteFieldValue;\n credentialMode: string;\n displayName: string;\n encryptionKey: IntegrationRemoteFieldValue;\n id: string;\n lastSyncedAt: string | null;\n provider: string;\n providerSecret: IntegrationRemoteFieldValue;\n status: string;\n username: string;\n}\n\nexport function createIntegrationSchema(\n strategyId = \"aes-256-gcm\",\n): EntitySchema<IntegrationEntity, IntegrationRemoteRecord, string> {\n return {\n cacheCollection: \"integrations\",\n createEntity(remote) {\n return {\n apiUrl: remote.apiUrl,\n authHash: (remote.authHash as string | null) ?? null,\n credentialMode: remote.credentialMode,\n displayName: remote.displayName,\n encryptionKey: (remote.encryptionKey as string | null) ?? null,\n id: remote.id,\n lastSyncedAt: remote.lastSyncedAt,\n provider: remote.provider,\n providerSecret: (remote.providerSecret as string | null) ?? null,\n status: remote.status,\n username: remote.username,\n };\n },\n createRemote(entity) {\n return {\n apiUrl: entity.apiUrl,\n authHash: entity.authHash,\n credentialMode: entity.credentialMode,\n displayName: entity.displayName,\n encryptionKey: entity.encryptionKey,\n id: entity.id,\n lastSyncedAt: entity.lastSyncedAt,\n provider: entity.provider,\n providerSecret: entity.providerSecret,\n status: entity.status,\n username: entity.username,\n };\n },\n defaultStrategyId: strategyId,\n fields: [\n {\n encrypted: true,\n entityPath: \"authHash\",\n },\n {\n encrypted: true,\n entityPath: \"providerSecret\",\n },\n {\n encrypted: true,\n entityPath: \"encryptionKey\",\n },\n ],\n name: \"integration\",\n };\n}"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "e2ee-client-backend",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Browser-first E2EE client backend with repository, adapter, cache, and crypto strategy abstractions.",
|
|
5
|
+
"homepage": "https://github.com/benedikt-weyer/e2ee-client-backend#readme",
|
|
6
|
+
"bugs": {
|
|
7
|
+
"url": "https://github.com/benedikt-weyer/e2ee-client-backend/issues"
|
|
8
|
+
},
|
|
9
|
+
"license": "Apache-2.0",
|
|
10
|
+
"type": "module",
|
|
11
|
+
"sideEffects": false,
|
|
12
|
+
"repository": {
|
|
13
|
+
"type": "git",
|
|
14
|
+
"url": "git+https://github.com/benedikt-weyer/e2ee-client-backend.git"
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"main": "./dist/index.js",
|
|
20
|
+
"module": "./dist/index.js",
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"exports": {
|
|
23
|
+
".": {
|
|
24
|
+
"types": "./dist/index.d.ts",
|
|
25
|
+
"import": "./dist/index.js"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"publishConfig": {
|
|
29
|
+
"access": "public",
|
|
30
|
+
"registry": "https://registry.npmjs.org/"
|
|
31
|
+
},
|
|
32
|
+
"engines": {
|
|
33
|
+
"node": ">=20"
|
|
34
|
+
},
|
|
35
|
+
"packageManager": "pnpm@10.6.5",
|
|
36
|
+
"scripts": {
|
|
37
|
+
"build": "tsup",
|
|
38
|
+
"clean": "rm -rf dist",
|
|
39
|
+
"next-version": "bash ./scripts/next-version.sh",
|
|
40
|
+
"prepare": "npm run build",
|
|
41
|
+
"publish:npm": "bash ./scripts/publish-npm.sh",
|
|
42
|
+
"test": "vitest run",
|
|
43
|
+
"test:watch": "vitest",
|
|
44
|
+
"typecheck": "tsc --noEmit"
|
|
45
|
+
},
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"@noble/hashes": "^2.0.1",
|
|
48
|
+
"lokijs": "^1.5.12",
|
|
49
|
+
"mlkem-wasm": "^0.0.7",
|
|
50
|
+
"zod": "^4.3.6"
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@types/lokijs": "^1.5.14",
|
|
54
|
+
"@types/node": "^20",
|
|
55
|
+
"tsup": "^8.5.0",
|
|
56
|
+
"typescript": "^5",
|
|
57
|
+
"vitest": "^4.1.4"
|
|
58
|
+
}
|
|
59
|
+
}
|