import { decrypt, encrypt } from '../crypto' import { ensureUint8Array, jsonToUint8Array, Uint8ArrayToJson } from '../data/bin' export interface Encoder { encode: (data: T) => Promise decode: (data: Uint8Array) => Promise } export class NoopEncoder implements Encoder { async encode(data: any): Promise { return data } async decode(data: Uint8Array): Promise { return data } } export class JsonEncoder implements Encoder { async encode(data: any): Promise { return jsonToUint8Array(data) } async decode(data: Uint8Array): Promise { return Uint8ArrayToJson(ensureUint8Array(data)) } } export class CryptoEncoder implements Encoder { key: CryptoKey constructor(key: CryptoKey) { this.key = key } async encode(data: any): Promise { const plain = jsonToUint8Array(data) return await encrypt(plain, this.key) } async decode(data: Uint8Array): Promise { const plain = await decrypt(ensureUint8Array(data), this.key) return Uint8ArrayToJson(ensureUint8Array(plain)) } }