diff --git a/src/services/service.ts b/src/services/service.ts index c3836ae..6c6fc1c 100755 --- a/src/services/service.ts +++ b/src/services/service.ts @@ -301,6 +301,30 @@ export default class Services { } } + private isFileBlob(value: any): value is { type: string, data: Uint8Array } { + return ( + typeof value === 'object' && + value !== null && + typeof value.type === 'string' && + value.data instanceof Uint8Array + ); + } + + private splitData(obj: Record) { + const jsonCompatibleData: Record = {}; + const binaryData: Record = {}; + + for (const [key, value] of Object.entries(obj)) { + if (this.isFileBlob(value)) { + binaryData[key] = value; + } else { + jsonCompatibleData[key] = value; + } + } + + return { jsonCompatibleData, binaryData }; + } + public async createProcess( privateData: Record, publicData: Record, @@ -309,8 +333,19 @@ export default class Services { const relayAddress = this.getAllRelays()[0]['spAddress']; const feeRate = 1; - const encodedPrivateData = this.sdkClient.encode_pcd(privateData); - const encodedPublicData = this.sdkClient.encode_pcd(publicData); + // We can't encode files as the rest because Uint8Array is not valid json + // So we first take them apart and we will encode them separately and put them back in the right object + // TODO encoding of relatively large binaries (=> 1M) is a bit long now and blocking + const privateSplitData = this.splitData(privateData); + const publicSplitData = this.splitData(publicData); + const encodedPrivateData = { + ...this.sdkClient.encode_json(privateSplitData.jsonCompatibleData), + ...this.sdkClient.encode_binary(privateSplitData.binaryData) + }; + const encodedPublicData = { + ...this.sdkClient.encode_json(publicSplitData.jsonCompatibleData), + ...this.sdkClient.encode_binary(publicSplitData.binaryData) + }; let members: Set = new Set(); for (const role of Object.values(roles!)) {