diff --git a/frontend/sdk/package-lock.json b/frontend/sdk/package-lock.json index 1300cc9..1c057ea 100644 --- a/frontend/sdk/package-lock.json +++ b/frontend/sdk/package-lock.json @@ -1,18 +1,18 @@ { "name": "@code/sdk-elements", - "version": "0.0.0", + "version": "0.1.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@code/sdk-elements", - "version": "0.0.0", + "version": "0.1.0", "dependencies": { "@bufbuild/connect-web": "^0.8.6", "@bugsnag/js": "^7.20.2", "@bugsnag/plugin-vue": "^7.19.0", "@code-wallet/events": "^1.0.0", - "@code-wallet/library": "file:../../../code-sdk/packages/library", + "@code-wallet/library": "^1.0.4", "@code-wallet/rpc": "^1.0.0", "@headlessui/vue": "^1.7.7", "@heroicons/vue": "^2.0.16", @@ -76,28 +76,6 @@ "typescript": "^5.1.6" } }, - "../../../code-sdk/packages/library": { - "name": "@code-wallet/library", - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "@code-wallet/rpc": "^1.0.0", - "@noble/curves": "^1.2.0", - "@noble/hashes": "^1.3.0", - "bs58": "^5.0.0", - "buffer": "6.0.3" - }, - "devDependencies": { - "@types/chai": "^4.3.5", - "@types/mocha": "^10.0.1", - "@types/node": "^20.5.7", - "chai": "^4.3.8", - "esm": "^3.2.25", - "ts-mocha": "^10.0.0", - "ts-node": "^10.9.1", - "typescript": "^5.1.6" - } - }, "../../../code-sdk/packages/rpc": { "name": "@code-wallet/rpc", "version": "1.0.0", @@ -332,13 +310,21 @@ "integrity": "sha512-uxIq+H3Q7+NOgDKMGaBapGa6io0t4DSMdM+TClN4Qn29BQcvNlCZBhQR1aWpg9AUjzU5u6NQSv1LqAEXSR+7OA==" }, "node_modules/@code-wallet/library": { - "resolved": "../../../code-sdk/packages/library", - "link": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@code-wallet/library/-/library-1.1.1.tgz", + "integrity": "sha512-uhaheMS1ud2HVDEF07iEat9t5XMoWvfTOi8mVrsuzqPXIjQdeQWpUmxlkFusdbXl8d1BePmFq28FO3niklnAYw==", + "dependencies": { + "@code-wallet/rpc": "^1.1.0", + "@noble/curves": "^1.2.0", + "@noble/hashes": "^1.3.0", + "bs58": "^5.0.0", + "buffer": "6.0.3" + } }, "node_modules/@code-wallet/rpc": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@code-wallet/rpc/-/rpc-1.0.0.tgz", - "integrity": "sha512-rVLv3GfkJe7eZOzi03PB8HQiIaFQmqMiVyEHiKG+7VQnDx5XzPquaZXjkaGpjt3M8q0KkMJzmPotCESiEtOeLA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@code-wallet/rpc/-/rpc-1.1.0.tgz", + "integrity": "sha512-D+nBumqYLkpknCThriNpWbYOdPkA9h1wCh0VfCyAX38mmkI1C2RAAzuFQFE1daOmmCp8k7qT04TATxl7GwEjMA==", "dependencies": { "@bufbuild/connect": "^0.8.6", "@bufbuild/connect-web": "^0.8.6", @@ -5183,27 +5169,21 @@ "integrity": "sha512-uxIq+H3Q7+NOgDKMGaBapGa6io0t4DSMdM+TClN4Qn29BQcvNlCZBhQR1aWpg9AUjzU5u6NQSv1LqAEXSR+7OA==" }, "@code-wallet/library": { - "version": "file:../../../code-sdk/packages/library", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@code-wallet/library/-/library-1.1.1.tgz", + "integrity": "sha512-uhaheMS1ud2HVDEF07iEat9t5XMoWvfTOi8mVrsuzqPXIjQdeQWpUmxlkFusdbXl8d1BePmFq28FO3niklnAYw==", "requires": { - "@code-wallet/rpc": "^1.0.0", + "@code-wallet/rpc": "^1.1.0", "@noble/curves": "^1.2.0", "@noble/hashes": "^1.3.0", - "@types/chai": "^4.3.5", - "@types/mocha": "^10.0.1", - "@types/node": "^20.5.7", "bs58": "^5.0.0", - "buffer": "6.0.3", - "chai": "^4.3.8", - "esm": "^3.2.25", - "ts-mocha": "^10.0.0", - "ts-node": "^10.9.1", - "typescript": "^5.1.6" + "buffer": "6.0.3" } }, "@code-wallet/rpc": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@code-wallet/rpc/-/rpc-1.0.0.tgz", - "integrity": "sha512-rVLv3GfkJe7eZOzi03PB8HQiIaFQmqMiVyEHiKG+7VQnDx5XzPquaZXjkaGpjt3M8q0KkMJzmPotCESiEtOeLA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@code-wallet/rpc/-/rpc-1.1.0.tgz", + "integrity": "sha512-D+nBumqYLkpknCThriNpWbYOdPkA9h1wCh0VfCyAX38mmkI1C2RAAzuFQFE1daOmmCp8k7qT04TATxl7GwEjMA==", "requires": { "@bufbuild/connect": "^0.8.6", "@bufbuild/connect-web": "^0.8.6", diff --git a/frontend/sdk/package.json b/frontend/sdk/package.json index 95f847e..1b8870a 100644 --- a/frontend/sdk/package.json +++ b/frontend/sdk/package.json @@ -1,7 +1,7 @@ { "name": "@code/sdk-elements", "private": true, - "version": "0.1.0", + "version": "1.1.0", "main": "./dist/code.umd.js", "module": "./dist/code.mjs", "typings": "./dist/index.d.ts", diff --git a/frontend/sdk/src/utils/payment-request.ts b/frontend/sdk/src/utils/payment-request.ts index d72f6f7..50ef821 100644 --- a/frontend/sdk/src/utils/payment-request.ts +++ b/frontend/sdk/src/utils/payment-request.ts @@ -2,7 +2,7 @@ import { useConfig } from '../config'; import { Kik } from './'; import { EventChannel, InternalCardEvents, InternalEvents } from "@code-wallet/events"; -import { PaymentRequestIntent, decode, encode } from "@code-wallet/library"; +import { PaymentRequestIntent, decode, encode, PublicKey } from "@code-wallet/library"; import * as proto from '@code-wallet/rpc'; class PaymentRequest { @@ -113,16 +113,52 @@ class PaymentRequest { await this.listen(); } + private async getStatus() : Promise { + const config = useConfig(); + const getStatus = await proto.RpcStream.createUnaryMethod(proto.MicroPayment, "getStatus", config.wsPath()); + try { + const intentId = PublicKey.fromBase58(this.intent.getIntentId()); + const res = await getStatus(new proto.GetStatusRequest({ + intentId: { + value: intentId.toBuffer(), + }, + })); + return res; + } catch (error) { + if (this.emitter) { + this.emitter.emit("error", error as any); + } + } + } + + private async sendRequest() : Promise { + const config = useConfig(); + const req = await this.toProto(); + const msgSend = await proto.RpcStream.createUnaryMethod(proto.Messaging, "sendMessage", config.wsPath()); + try { + const res = await msgSend(req); + if (res.result == proto.SendMessageResponse_Result.OK) { + return res; + } else { + if (this.emitter) { + this.emitter.emit("error", { message: "Failed to send message" }); + } + } + } catch (error) { + if (this.emitter) { + this.emitter.emit("error", error as any); + } + } + } + private async listen() { if (!this.emitter) { return; } const { rendezvousKeypair } = this.intent; const config = useConfig(); - const req = await this.toProto(); await this.generateKikCode(); - const msgSend = await proto.RpcStream.createUnaryMethod(proto.Messaging, "sendMessage", config.wsPath()); const msgStream = await proto.RpcStream.create(proto.Messaging, "openMessageStream", config.wsPath(), { onClose: () => { if (this.emitter) { @@ -136,21 +172,21 @@ class PaymentRequest { }, }); - try { - const res = await msgSend(req); - if (res.result != proto.SendMessageResponse_Result.OK) { - if (this.emitter) { - this.emitter.emit("error", { message: "Failed to send message" }); - } - return; - } - } catch (error) { - if (this.emitter) { - this.emitter.emit("error", error as any); + // Get the status of the intent (in case the server already requested it) + const status = await this.getStatus(); + if (!status) { + return; // Something went wrong, don't continue + } + + // If the intent does not exist, send the initial request here + if (!status.exists) { + const res = await this.sendRequest(); + if (!res) { + return; // Something went wrong, don't continue } - return; } + // Open the message stream msgStream.write(new proto.OpenMessageStreamRequest({ rendezvousKey: new proto.RendezvousKey({ value: rendezvousKeypair.publicKey,