diff --git a/.gitignore b/.gitignore index a547bf3..9413cd4 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,5 @@ dist-ssr *.njsproj *.sln *.sw? + +build.sh \ No newline at end of file diff --git a/README.md b/README.md index a573cee..237b459 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ # did:wba examples --> built using [Agent Network Protocol](https://github.com/chgaowei/AgentNetworkProtocol) + +编译,部署,执行: +sudo ./build.sh diff --git a/index.html b/index.html index 6cb894f..e8f05e6 100644 --- a/index.html +++ b/index.html @@ -11,40 +11,75 @@

DID:WBA Test Interface

- + +
-
-
- - +
+ +
+
+ +
- + + +
+
+ +
+ +
+
+ + +
+
+ +
-
+ +
- + +
-
+ +
- + +
-
- - +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
- -
\ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..7c6ab17 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,960 @@ +{ + "name": "wba", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "wba", + "version": "0.0.0", + "devDependencies": { + "@types/node": "^22.10.2", + "typescript": "^5.7.2", + "vite": "^6.0.3" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", + "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", + "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", + "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", + "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", + "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", + "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", + "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", + "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", + "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", + "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", + "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", + "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", + "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", + "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", + "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", + "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", + "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", + "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", + "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", + "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", + "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", + "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", + "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", + "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz", + "integrity": "sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.1.tgz", + "integrity": "sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.1.tgz", + "integrity": "sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.1.tgz", + "integrity": "sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.1.tgz", + "integrity": "sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.1.tgz", + "integrity": "sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.1.tgz", + "integrity": "sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.1.tgz", + "integrity": "sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.1.tgz", + "integrity": "sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.1.tgz", + "integrity": "sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.28.1.tgz", + "integrity": "sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.1.tgz", + "integrity": "sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.1.tgz", + "integrity": "sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.1.tgz", + "integrity": "sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.1.tgz", + "integrity": "sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.1.tgz", + "integrity": "sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.1.tgz", + "integrity": "sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.1.tgz", + "integrity": "sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.1.tgz", + "integrity": "sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.10.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", + "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/esbuild": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", + "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.0", + "@esbuild/android-arm": "0.24.0", + "@esbuild/android-arm64": "0.24.0", + "@esbuild/android-x64": "0.24.0", + "@esbuild/darwin-arm64": "0.24.0", + "@esbuild/darwin-x64": "0.24.0", + "@esbuild/freebsd-arm64": "0.24.0", + "@esbuild/freebsd-x64": "0.24.0", + "@esbuild/linux-arm": "0.24.0", + "@esbuild/linux-arm64": "0.24.0", + "@esbuild/linux-ia32": "0.24.0", + "@esbuild/linux-loong64": "0.24.0", + "@esbuild/linux-mips64el": "0.24.0", + "@esbuild/linux-ppc64": "0.24.0", + "@esbuild/linux-riscv64": "0.24.0", + "@esbuild/linux-s390x": "0.24.0", + "@esbuild/linux-x64": "0.24.0", + "@esbuild/netbsd-x64": "0.24.0", + "@esbuild/openbsd-arm64": "0.24.0", + "@esbuild/openbsd-x64": "0.24.0", + "@esbuild/sunos-x64": "0.24.0", + "@esbuild/win32-arm64": "0.24.0", + "@esbuild/win32-ia32": "0.24.0", + "@esbuild/win32-x64": "0.24.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.28.1.tgz", + "integrity": "sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.28.1", + "@rollup/rollup-android-arm64": "4.28.1", + "@rollup/rollup-darwin-arm64": "4.28.1", + "@rollup/rollup-darwin-x64": "4.28.1", + "@rollup/rollup-freebsd-arm64": "4.28.1", + "@rollup/rollup-freebsd-x64": "4.28.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.28.1", + "@rollup/rollup-linux-arm-musleabihf": "4.28.1", + "@rollup/rollup-linux-arm64-gnu": "4.28.1", + "@rollup/rollup-linux-arm64-musl": "4.28.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.28.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.28.1", + "@rollup/rollup-linux-riscv64-gnu": "4.28.1", + "@rollup/rollup-linux-s390x-gnu": "4.28.1", + "@rollup/rollup-linux-x64-gnu": "4.28.1", + "@rollup/rollup-linux-x64-musl": "4.28.1", + "@rollup/rollup-win32-arm64-msvc": "4.28.1", + "@rollup/rollup-win32-ia32-msvc": "4.28.1", + "@rollup/rollup-win32-x64-msvc": "4.28.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/typescript": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.3.tgz", + "integrity": "sha512-Cmuo5P0ENTN6HxLSo6IHsjCLn/81Vgrp81oaiFFMRa8gGDj5xEjIcEpf2ZymZtZR8oU0P2JX5WuUp/rlXcHkAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.24.0", + "postcss": "^8.4.49", + "rollup": "^4.23.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + } + } +} diff --git a/src/js/api.ts b/src/js/api.ts index 12c0c8c..64aa1fa 100644 --- a/src/js/api.ts +++ b/src/js/api.ts @@ -1,6 +1,7 @@ import type { DIDDocument, APIResponse, AuthResponse } from '../types'; -const BASE_URL = 'https://pi-unlimited.com'; +const BASE_URL = 'https://agent-did.com'; +const AUTH_URL = 'service.agent-network-protocol.com' export async function uploadDIDDocument( userId: string, @@ -32,53 +33,41 @@ export async function uploadDIDDocument( } } -// export async function uploadDIDDocument(userId: string, didDocument: string) { -// const url = `https://pi-unlimited.com/wba/user/${userId}/did.json`; -// try { -// const response = await fetch(url, { -// method: 'PUT', -// headers: { -// 'Content-Type': 'application/json', -// }, -// body: didDocument -// }); - -// if (!response.ok) { -// const errorResponse = await response.text(); -// throw new Error(`Error: ${response.status} - ${errorResponse}`); -// } - -// const result = await response.json(); -// console.log('DID Document uploaded successfully:', result); -// } catch (error) { -// console.error('Error uploading DID Document:', error); -// } -// } - export async function retrieveDIDDocument( - userId: string + did: string ): Promise> { try { - const url = `${BASE_URL}/wba/user/${userId}/did.json`; - console.log(`Fetching DID Document from: ${url}`); + // Parse DID format: did:wba:example.com%3A3000:user:alice -> https://example.com:3000/user/alice/did.json + const parts = did.split(':'); + if (parts.length < 5 || parts[0] !== 'did' || parts[1] !== 'wba') { + throw new Error('Invalid DID format'); + } - const response = await fetch(url); + // Decode the domain and port + const domain = decodeURIComponent(parts[2]); + // Join the remaining parts as the path + const path = parts.slice(3).join('/'); - let data: DIDDocument | undefined; - if (response.ok) { - data = await response.json() as DIDDocument; - console.log('DID Document retrieved successfully:', data); - } else { - console.error(`Failed to retrieve DID Document. Status: ${response.status}`); + const url = `https://${domain}/${path}/did.json`; + console.log(`Fetching DID Document from: ${url}`); + + const response = await fetch(url, { + method: 'GET', + headers: { + 'Accept': 'application/json', + } + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); } return { - ok: response.ok, + ok: true, status: response.status, - data + data: await response.json() }; } catch (error) { - console.error('Error retrieving DID Document:', error); return { ok: false, status: 0, @@ -88,33 +77,62 @@ export async function retrieveDIDDocument( } export async function testAuthentication( - endpoint: 'test' | 'test401', - authToken?: string -): Promise { + didDocument: string, + privateKey: string +): Promise> { try { - const headers = new Headers(); - if (authToken) { - headers.append('Authorization', `Bearer ${authToken}`); + const response = await fetch(`https://${AUTH_URL}/wba/demo/auth`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + did_document: didDocument, + private_key: privateKey, + auth_url: 'https://service.agent-network-protocol.com/wba/test' + }) + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); } - const response = await fetch(`${BASE_URL}/wba/${endpoint}`, { - headers - }); + const data = await response.json(); + return { + ok: true, + status: response.status, + data + }; + } catch (error) { + return { + ok: false, + status: 0, + error: error instanceof Error ? error.message : 'Unknown error occurred' + }; + } +} - const token = response.headers.get('Authorization'); - const wwwAuthenticate = response.headers.get('WWW-Authenticate'); +export async function generateDIDDocument(): Promise> { + try { + const response = await fetch(`${BASE_URL}/wba/demo/generate`, { + method: 'GET', + headers: { + 'Accept': 'application/json', + } + }); - let data: string | undefined; - if (response.ok) { - data = await response.text(); + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); } + const data = await response.json(); return { - ok: response.ok, + ok: true, status: response.status, - token: token ? token.replace('Bearer ', '') : undefined, - wwwAuthenticate: wwwAuthenticate ?? undefined, - data + data: { + did_document: data.did_document, + private_key: data.private_key + } }; } catch (error) { return { diff --git a/src/js/utils.ts b/src/js/utils.ts index ef819e3..063d7b8 100644 --- a/src/js/utils.ts +++ b/src/js/utils.ts @@ -6,13 +6,21 @@ export function generateRandomId(length: number = 16): string { ).join(''); } -export function showResponse( - element: HTMLElement, - message: string, - isError: boolean = false -): void { - element.className = `response ${isError ? 'error' : 'success'}`; - element.textContent = message; +export function showResponse(message: string, isError = false): void { + // 获取当前激活的tab内容区域 + const activeTab = document.querySelector('.tab-content.active'); + if (!activeTab) return; + + // 获取当前tab中的响应区域 + const responseArea = activeTab.querySelector('.response-area'); + if (!responseArea) return; + + // 清除之前的类 + responseArea.classList.remove('success', 'error'); + // 添加新的类 + responseArea.classList.add(isError ? 'error' : 'success'); + // 设置消息 + responseArea.textContent = message; } export function validateDIDDocument(doc: string): boolean { diff --git a/src/main.ts b/src/main.ts index 90686c6..6bbe355 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,10 +1,41 @@ import './style.css'; -import { generateRandomId, showResponse, validateDIDDocument } from './js/utils'; -import { uploadDIDDocument, retrieveDIDDocument, testAuthentication } from './js/api'; +import { showResponse, validateDIDDocument } from './js/utils'; +import { uploadDIDDocument, retrieveDIDDocument, testAuthentication, generateDIDDocument } from './js/api'; + +// 辅助函数:自动调整textarea高度 +function autoResizeTextarea(textarea: HTMLTextAreaElement) { + // 先将高度设置为最小值,以便正确计算所需高度 + textarea.style.height = 'auto'; + // 设置高度为滚动高度 + textarea.style.height = (textarea.scrollHeight + 2) + 'px'; +} + +// 辅助函数:设置textarea的值并自动调整高度 +function setTextareaValueAndResize(textarea: HTMLTextAreaElement, value: string) { + textarea.value = value; + autoResizeTextarea(textarea); +} document.addEventListener('DOMContentLoaded', () => { console.log('Initializing application...'); + // 获取DOM元素 + const retrieveIdInput = document.getElementById('retrieveId') as HTMLInputElement; + const generateDocBtn = document.getElementById('generateDocBtn'); + const uploadDidDocEl = document.getElementById('uploadDidDocument') as HTMLTextAreaElement; + const uploadBtn = document.getElementById('uploadBtn'); + + // 初始化所有textarea的自动调整高度 + const allTextareas = document.querySelectorAll('textarea'); + allTextareas.forEach(textarea => { + // 为所有textarea添加input和change事件监听 + ['input', 'change'].forEach(event => { + textarea.addEventListener(event, () => autoResizeTextarea(textarea as HTMLTextAreaElement)); + }); + // 初始化时调整高度 + autoResizeTextarea(textarea as HTMLTextAreaElement); + }); + // Initialize tabs const tabs = document.querySelectorAll('.tab'); tabs.forEach(tab => { @@ -16,56 +47,84 @@ document.addEventListener('DOMContentLoaded', () => { if (tabId) { const content = document.getElementById(tabId); content?.classList.add('active'); + // 切换tab时重新调整文本框高度 + content?.querySelectorAll('textarea').forEach(textarea => { + autoResizeTextarea(textarea as HTMLTextAreaElement); + }); } }); }); - // Initialize event listeners - const responseEl = document.getElementById('response'); - if (!responseEl) return; + // Generate DID Document and Private Key + generateDocBtn?.addEventListener('click', async () => { + try { + const response = await generateDIDDocument(); + + if (response.ok && response.data) { + const generatedDocEl = document.getElementById('generatedDocument') as HTMLTextAreaElement; + const generatedKeyEl = document.getElementById('generatedKey') as HTMLTextAreaElement; + const uploadDocEl = document.getElementById('uploadDidDocument') as HTMLTextAreaElement; + const uploadKeyEl = document.getElementById('uploadPrivateKey') as HTMLTextAreaElement; + const retrieveIdEl = document.getElementById('retrieveId') as HTMLTextAreaElement; + const testDidEl = document.getElementById('testDid') as HTMLTextAreaElement; + const authUrlEl = document.getElementById('authUrl') as HTMLTextAreaElement; - // Generate ID - const generateBtn = document.getElementById('generateId'); - const userIdInput = document.getElementById('userId') as HTMLInputElement; - const retrieveIdInput = document.getElementById('retrieveId') as HTMLInputElement; + // Parse and format the DID document + const didDocument = JSON.parse(response.data.did_document); + const formattedDoc = JSON.stringify(didDocument, null, 2); + + // Set values and resize textareas + setTextareaValueAndResize(generatedDocEl, formattedDoc); + setTextareaValueAndResize(generatedKeyEl, response.data.private_key); + setTextareaValueAndResize(uploadDocEl, formattedDoc); + setTextareaValueAndResize(uploadKeyEl, response.data.private_key); + + // Set the DID for retrieve and test + if (didDocument && typeof didDocument === 'object' && 'id' in didDocument) { + setTextareaValueAndResize(retrieveIdEl, didDocument.id); + setTextareaValueAndResize(testDidEl, didDocument.id); + } - generateBtn?.addEventListener('click', () => { - const id = generateRandomId(); - if (userIdInput) userIdInput.value = id; - if (retrieveIdInput) retrieveIdInput.value = id; + // Set default auth URL if empty + if (!authUrlEl.value) { + setTextareaValueAndResize(authUrlEl, 'https://service.agent-network-protocol.com/wba/test'); + } + + showResponse('Successfully generated DID document and private key. \n\nWARNING: This DID document and private key are for testing purposes only. Do not use in a production environment!'); + } else { + showResponse(response.error || 'Failed to generate DID document', true); + } + } catch (error) { + showResponse(`Error generating DID document: ${error}`, true); + } }); // Upload - const uploadBtn = document.getElementById('uploadBtn'); - const didDocInput = document.getElementById('didDocument') as HTMLTextAreaElement; - uploadBtn?.addEventListener('click', async () => { - if (!userIdInput?.value || !didDocInput?.value) { - showResponse(responseEl, 'Please fill in all fields', true); + if (!uploadDidDocEl?.value) { + showResponse('Please generate a DID document first', true); return; } - if (!validateDIDDocument(didDocInput.value)) { - showResponse(responseEl, 'Invalid DID Document format', true); + if (!validateDIDDocument(uploadDidDocEl.value)) { + showResponse('Invalid DID Document format', true); return; } - const response = await uploadDIDDocument(userIdInput.value, didDocInput.value) as { ok: boolean; error?: string; status?: number } | unknown; - - if (typeof response === 'object' && response !== null && 'ok' in response) { + // 从DID文档中提取ID + try { + const didDoc = JSON.parse(uploadDidDocEl.value); + const userId = didDoc.id?.split(':').pop() || ''; + + const response = await uploadDIDDocument(userId, uploadDidDocEl.value); + if (response.ok) { - showResponse(responseEl, - `Successfully uploaded DID document.\nYour DID is: did:wba:pi-unlimited.com:wba:user:${userIdInput.value}` - ); + showResponse(`Successfully uploaded DID document.\nYour DID is: ${didDoc.id}`); } else { - const { error, status } = response as { ok: boolean; error?: string; status?: number }; - showResponse(responseEl, - error || `Upload failed with status: ${status}`, - true - ); + showResponse(response.error || `Upload failed with status: ${response.status}`, true); } - } else { - showResponse(responseEl, 'Unexpected response format', true); + } catch (error) { + showResponse('Failed to parse DID document', true); } }); @@ -74,53 +133,124 @@ document.addEventListener('DOMContentLoaded', () => { retrieveBtn?.addEventListener('click', async () => { if (!retrieveIdInput?.value) { - showResponse(responseEl, 'Please enter a User ID', true); + showResponse('Please enter a User ID', true); return; } const response = await retrieveDIDDocument(retrieveIdInput.value); if (response.ok && response.data) { - showResponse(responseEl, - `Retrieved DID document:\n${JSON.stringify(response.data, null, 2)}` - ); + showResponse(`Retrieved DID document success:\n${JSON.stringify(response.data, null, 2)}`); } else { - showResponse(responseEl, - response.error || `Retrieval failed with status: ${response.status}`, - true - ); + showResponse(response.error || `Retrieval failed with status: ${response.status}`, true); } }); - // Test Authentication - const authTokenInput = document.getElementById('authToken') as HTMLInputElement; - - document.getElementById('testNormalBtn')?.addEventListener('click', () => - handleAuthTest('test') - ); - document.getElementById('test401Btn')?.addEventListener('click', () => - handleAuthTest('test401') - ); - - async function handleAuthTest(endpoint: 'test' | 'test401') { - const response = await testAuthentication(endpoint, authTokenInput?.value); + // 添加辅助函数来更新测试页面的 DID + function updateTestDID() { + const generatedDocEl = document.getElementById('generatedDocument') as HTMLTextAreaElement; + const testDidEl = document.getElementById('testDid') as HTMLTextAreaElement; - if (response.ok) { - if (response.token && authTokenInput) { - authTokenInput.value = response.token; + if (generatedDocEl.value) { + try { + const didDocument = JSON.parse(generatedDocEl.value); + if (didDocument && typeof didDocument === 'object' && 'id' in didDocument) { + testDidEl.value = didDocument.id; + autoResizeTextarea(testDidEl); + } + } catch (error) { + console.error('Error parsing DID document:', error); } - showResponse(responseEl!, - `Authentication test successful: ${response.data}` - ); - } else if (response.status === 401 && response.wwwAuthenticate) { - showResponse(responseEl!, - `Received 401 response with WWW-Authenticate: ${response.wwwAuthenticate}` - ); - } else if (responseEl) { - showResponse(responseEl, - response.error || `Authentication test failed with status: ${response.status}`, - true - ); } } + + // Tab 切换逻辑 + const tabButtons = document.querySelectorAll('.tab'); + tabButtons.forEach(button => { + button.addEventListener('click', () => { + const tabId = button.getAttribute('data-tab'); + if (!tabId) return; + + // 移除所有 active 类 + tabButtons.forEach(btn => btn.classList.remove('active')); + const tabContents = document.querySelectorAll('.tab-content'); + tabContents.forEach(content => content.classList.remove('active')); + + // 添加 active 类到当前选中的 tab + button.classList.add('active'); + document.getElementById(tabId)?.classList.add('active'); + + // 如果切换到 retrieve 或 test tab,自动填充 DID + if (tabId === 'retrieve') { + const retrieveIdEl = document.getElementById('retrieveId') as HTMLInputElement; + const generatedDocEl = document.getElementById('generatedDocument') as HTMLTextAreaElement; + if (generatedDocEl.value) { + try { + const didDocument = JSON.parse(generatedDocEl.value); + if (didDocument && typeof didDocument === 'object' && 'id' in didDocument) { + retrieveIdEl.value = didDocument.id; + } + } catch (error) { + console.error('Error parsing DID document:', error); + } + } + } else if (tabId === 'test') { + updateTestDID(); + } + }); + }); + + // Test Authentication + const testAuthBtn = document.getElementById('testAuthBtn'); + testAuthBtn?.addEventListener('click', async () => { + try { + const generatedDocEl = document.getElementById('generatedDocument') as HTMLTextAreaElement; + const generatedKeyEl = document.getElementById('generatedKey') as HTMLTextAreaElement; + const authUrlEl = document.getElementById('authUrl') as HTMLTextAreaElement; + + if (!generatedDocEl.value || !generatedKeyEl.value || !authUrlEl.value) { + showResponse('Please generate DID document and provide auth URL first', true); + return; + } + + const response = await testAuthentication( + generatedDocEl.value, + generatedKeyEl.value + ); + + if (response.ok && response.data) { + // 更新响应字段 + const authorizationEl = document.getElementById('authorization') as HTMLTextAreaElement; + const authCodeEl = document.getElementById('authCode') as HTMLTextAreaElement; + const errorMessageEl = document.getElementById('errorMessage') as HTMLTextAreaElement; + const accessTokenEl = document.getElementById('accessToken') as HTMLTextAreaElement; + + // 设置值并自动调整大小 + const setValueAndResize = (el: HTMLTextAreaElement, value: string) => { + el.value = value; + autoResizeTextarea(el); + }; + + setValueAndResize(authorizationEl, response.data.authorization || ''); + setValueAndResize(authCodeEl, response.data.auth_code?.toString() || ''); + setValueAndResize(errorMessageEl, response.data.error_message || ''); + setValueAndResize(accessTokenEl, response.data.access_token || ''); + + showResponse('Authentication test completed successfully'); + } else { + showResponse(response.error || 'Authentication test failed', true); + } + } catch (error) { + showResponse(`Error during authentication test: ${error}`, true); + } + }); + + // 为所有文本框添加自动调整大小的功能 + document.querySelectorAll('.input-group textarea').forEach(textarea => { + textarea.addEventListener('input', () => { + autoResizeTextarea(textarea as HTMLTextAreaElement); + }); + // 初始化时调整大小 + autoResizeTextarea(textarea as HTMLTextAreaElement); + }); }); \ No newline at end of file diff --git a/src/style.css b/src/style.css index ca3b6d5..29b6534 100644 --- a/src/style.css +++ b/src/style.css @@ -23,20 +23,28 @@ body { } .tab { - flex: 1; - padding: 8px 16px; + padding: 10px 20px; border: none; background: none; cursor: pointer; - border-radius: 5px; + font-size: 16px; + color: #666; +} + +.tab:hover { + color: #333; } .tab.active { - background: lightblue; + color: #007bff; + border-bottom: 2px solid #007bff; } .tab-content { display: none; + padding: 20px; + background: #fff; + border-radius: 0 0 4px 4px; } .tab-content.active { @@ -44,10 +52,41 @@ body { } .input-group { - margin-bottom: 1rem; + margin-bottom: 20px; + width: 100%; +} + +.input-group label { + display: block; + margin-bottom: 8px; + font-weight: 500; + color: #333; +} + +.input-group textarea { + width: 100%; + min-height: 30px; + padding: 8px; + margin-top: 5px; + border: 1px solid #ccc; + border-radius: 4px; + font-family: monospace; + font-size: 14px; + line-height: 1.5; + resize: none; + overflow: hidden; +} + +.input-group textarea[readonly] { + background-color: #f5f5f5; + cursor: default; +} + +.input-group textarea::placeholder { + color: #999; } -input, textarea { +input { width: 100%; padding: 8px; margin: 4px 0; @@ -56,22 +95,54 @@ input, textarea { box-sizing: border-box; } -textarea { - min-height: 100px; - font-family: monospace; -} - -button { - background: #ddd; - color: black; - border: none; +.action-button { padding: 8px 16px; + background-color: #007bff; + color: white; + border: none; border-radius: 4px; cursor: pointer; + font-size: 14px; + transition: all 0.2s ease; + margin-bottom: 16px; +} + +.action-button:hover { + background-color: #0056b3; + transform: translateY(-1px); +} + +.action-button:active { + background-color: #004085; + transform: translateY(1px); +} + +.response-area { + margin: 10px 0 20px 0; + padding: 12px 15px; + border-radius: 4px; + font-family: monospace; + min-height: 20px; + white-space: pre-wrap; + word-break: break-word; + font-size: 14px; + line-height: 1.5; +} + +.response-area:empty { + display: none; +} + +.response-area.success { + background-color: #d4edda; + border: 1px solid #c3e6cb; + color: #155724; } -button:hover { - background: lightgray; +.response-area.error { + background-color: #f8d7da; + border: 1px solid #f5c6cb; + color: #721c24; } .response { diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..8c2852a --- /dev/null +++ b/src/types.ts @@ -0,0 +1,18 @@ +export interface DIDDocument { + id: string; + [key: string]: any; // Allow for additional DID document properties +} + +export interface APIResponse { + ok: boolean; + status: number; + error?: string; + data?: T; +} + +export interface AuthResponse { + authorization: string; + auth_code: number; + error_message: string | null; + access_token: string; +}