@idos-network/kwil-infra 3.0.0 → 3.0.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.
Files changed (32) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/actions/index.d.mts +1 -1
  3. package/dist/facesign/index.d.mts +2 -2
  4. package/dist/facesign/index.mjs +1 -1
  5. package/dist/facesign-signer-CTPPUFxT.mjs +2 -0
  6. package/dist/facesign-signer-CTPPUFxT.mjs.map +1 -0
  7. package/dist/{facesign-signer-5I8juA7p.d.mts → facesign-signer-Dqh899om.d.mts} +3 -2
  8. package/dist/facesign-signer-Dqh899om.d.mts.map +1 -0
  9. package/dist/{index-Bqz6trCk.d.mts → index-Bk8YCFlx.d.mts} +2 -2
  10. package/dist/{index-Bqz6trCk.d.mts.map → index-Bk8YCFlx.d.mts.map} +1 -1
  11. package/dist/index.d.mts +1 -1
  12. package/dist/index.mjs +1 -1
  13. package/dist/index.mjs.map +1 -1
  14. package/dist/nep413-D_D-6Yf6.mjs +2 -0
  15. package/dist/nep413-D_D-6Yf6.mjs.map +1 -0
  16. package/dist/signature-verification/index.d.mts +1 -1
  17. package/dist/signature-verification/index.mjs +1 -1
  18. package/dist/signature-verification/index.mjs.map +1 -1
  19. package/dist/xrp/utils.d.mts +41 -41
  20. package/dist/xrp/utils.d.mts.map +1 -1
  21. package/package.json +3 -3
  22. package/src/facesign/facesign-signer.test.ts +58 -1
  23. package/src/facesign/facesign-signer.ts +8 -0
  24. package/src/facesign/index.ts +1 -1
  25. package/src/near/create-near-wallet-kwil-signer.test.ts +218 -0
  26. package/src/near/create-near-wallet-kwil-signer.ts +121 -28
  27. package/src/near/nep413.ts +47 -37
  28. package/src/near/signature-verification.test.ts +35 -0
  29. package/src/near/signature-verification.ts +15 -36
  30. package/dist/facesign-signer-5I8juA7p.d.mts.map +0 -1
  31. package/dist/facesign-signer-z5T312uQ.mjs +0 -2
  32. package/dist/facesign-signer-z5T312uQ.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"facesign-signer-z5T312uQ.mjs","names":[],"sources":["../src/facesign/facesign-signer.ts"],"sourcesContent":["// Buffer after showing the iframe before posting a message, giving the enclave time to be ready.\nconst POST_MESSAGE_DELAY_MS = 300;\n// Safety net: reject proposals if the enclave doesn't respond within this window.\nconst PROPOSAL_TIMEOUT_MS = 10 * 60 * 1000; // 10 minutes\nconst RESET_TIMEOUT_MS = 15_000;\n\nexport interface FaceSignMetadata {\n name: string;\n description: string;\n}\n\nexport interface FaceSignSignerProviderOptions {\n metadata: FaceSignMetadata;\n enclaveUrl: string;\n}\n\ninterface SessionResponse {\n address: string;\n}\n\nexport class FaceSignSignerProvider {\n #iframe: HTMLIFrameElement | null = null;\n #container: HTMLDialogElement | null = null;\n\n #resolveOpenEnclave: (() => void) | null = null;\n #resolveSignMessage: ((signature: Uint8Array) => void) | null = null;\n #rejectSignMessage: ((error: Error) => void) | null = null;\n #resolveSessionProposal: ((response: SessionResponse) => void) | null = null;\n #rejectSessionProposal: ((error: Error) => void) | null = null;\n #resolveAddressRequest: ((address: string | null) => void) | null = null;\n #resolveReset: (() => void) | null = null;\n #rejectReset: ((error: Error) => void) | null = null;\n\n #messageListener: ((event: MessageEvent) => void) | null = null;\n #messageListenerInitialized = false;\n #proposalId = 0;\n #hasKey: boolean | null = null;\n #metadata: FaceSignMetadata;\n #enclaveUrl: string;\n #enclaveOrigin: string;\n\n signatureType = \"ed25519\";\n walletType = \"FaceSign\";\n publicAddress = \"\";\n publicKey = \"\";\n\n constructor(options: FaceSignSignerProviderOptions) {\n this.#metadata = options.metadata;\n this.#enclaveUrl = options.enclaveUrl;\n this.#enclaveOrigin = new URL(options.enclaveUrl).origin;\n }\n\n #setupMessageListener(): void {\n if (this.#messageListenerInitialized) {\n return;\n }\n\n this.#messageListener = (event: MessageEvent) => {\n if (event.origin !== this.#enclaveOrigin) return;\n\n if (event.data?.type === \"facesign_ready\") {\n this.#hasKey = !!event.data.hasKey;\n this.#resolveOpenEnclave?.();\n }\n\n if (event.data?.type === \"sign_proposal_response\") {\n const payload = event.data.data;\n if (!payload) return;\n\n if (payload.signature) {\n this.#resolveSignMessage?.(new Uint8Array(payload.signature));\n } else {\n this.#rejectSignMessage?.(new Error(\"Sign request rejected by user\"));\n }\n }\n\n if (event.data?.type === \"session_proposal_response\") {\n const payload = event.data.data;\n if (!payload) return;\n\n if (payload.approved && payload.address) {\n this.#resolveSessionProposal?.({ address: payload.address });\n } else {\n this.#rejectSessionProposal?.(new Error(\"Session request rejected by user\"));\n }\n }\n\n if (event.data?.type === \"address_response\") {\n const payload = event.data.data;\n this.#resolveAddressRequest?.(payload?.address ?? null);\n }\n\n if (event.data?.type === \"reset_complete\") {\n if (event.data.data?.ok) {\n this.#resolveReset?.();\n } else {\n this.#rejectReset?.(new Error(\"FaceSign enclave failed to delete its key\"));\n }\n }\n };\n\n window.addEventListener(\"message\", this.#messageListener);\n this.#messageListenerInitialized = true;\n }\n\n async preload(): Promise<{ hasKey: boolean }> {\n this.#setupMessageListener();\n await this.#ensureEnclave();\n return { hasKey: this.#hasKey ?? false };\n }\n\n async init(): Promise<string> {\n this.#setupMessageListener();\n\n const sessionProposal = await this.#sessionProposal();\n\n this.publicKey = sessionProposal.address;\n this.publicAddress = sessionProposal.address;\n\n return sessionProposal.address;\n }\n\n async getAddress(): Promise<string | null> {\n this.#setupMessageListener();\n await this.#ensureEnclave();\n\n if (!this.#hasKey) return null;\n\n return new Promise<string | null>((resolve) => {\n const timer = setTimeout(() => resolve(null), PROPOSAL_TIMEOUT_MS);\n\n this.#resolveAddressRequest = (address) => {\n clearTimeout(timer);\n this.#resolveAddressRequest = null;\n if (address) {\n this.publicKey = address;\n this.publicAddress = address;\n }\n resolve(address);\n };\n\n this.#iframe?.contentWindow?.postMessage(\n { type: \"address_request\", data: { id: ++this.#proposalId } },\n this.#enclaveUrl,\n );\n });\n }\n\n get signer(): this {\n return this;\n }\n\n async signMessage(message: Uint8Array | string): Promise<Uint8Array> {\n await this.#ensureEnclave();\n this.#showEnclave();\n\n const messageToSign = typeof message === \"string\" ? new TextEncoder().encode(message) : message;\n\n try {\n return await new Promise<Uint8Array>((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(\"FaceSign sign request timed out\"));\n }, PROPOSAL_TIMEOUT_MS);\n\n this.#resolveSignMessage = (sig) => {\n clearTimeout(timer);\n resolve(sig);\n };\n this.#rejectSignMessage = (err) => {\n clearTimeout(timer);\n reject(err);\n };\n\n setTimeout(() => {\n this.#iframe?.contentWindow?.postMessage(\n {\n type: \"sign_proposal\",\n data: {\n id: ++this.#proposalId,\n data: messageToSign,\n metadata: this.#metadata,\n },\n },\n this.#enclaveUrl,\n );\n }, POST_MESSAGE_DELAY_MS);\n });\n } finally {\n this.#resolveSignMessage = null;\n this.#rejectSignMessage = null;\n this.#hideEnclave();\n }\n }\n\n async #sessionProposal(): Promise<SessionResponse> {\n await this.#ensureEnclave();\n this.#showEnclave();\n\n try {\n return await new Promise<SessionResponse>((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(\"FaceSign session proposal timed out\"));\n }, PROPOSAL_TIMEOUT_MS);\n\n this.#resolveSessionProposal = (res) => {\n clearTimeout(timer);\n resolve(res);\n };\n this.#rejectSessionProposal = (err) => {\n clearTimeout(timer);\n reject(err);\n };\n\n setTimeout(() => {\n this.#iframe?.contentWindow?.postMessage(\n {\n type: \"session_proposal\",\n data: {\n id: ++this.#proposalId,\n metadata: this.#metadata,\n },\n },\n this.#enclaveUrl,\n );\n }, POST_MESSAGE_DELAY_MS);\n });\n } finally {\n this.#resolveSessionProposal = null;\n this.#rejectSessionProposal = null;\n this.#hideEnclave();\n }\n }\n\n async reset(): Promise<void> {\n this.#setupMessageListener();\n const deadline = Date.now() + RESET_TIMEOUT_MS;\n\n try {\n await this.#ensureEnclave(deadline - Date.now());\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(\n () => {\n reject(new Error(\"FaceSign reset timed out\"));\n },\n Math.max(deadline - Date.now(), 0),\n );\n\n this.#resolveReset = () => {\n clearTimeout(timer);\n this.#resolveReset = null;\n this.#rejectReset = null;\n resolve();\n };\n this.#rejectReset = (error) => {\n clearTimeout(timer);\n this.#resolveReset = null;\n this.#rejectReset = null;\n reject(error);\n };\n\n this.#iframe?.contentWindow?.postMessage(\n { type: \"reset\", data: { id: ++this.#proposalId } },\n this.#enclaveOrigin,\n );\n });\n } finally {\n this.destroy();\n }\n }\n\n hide(): void {\n this.#cancelPendingProposals();\n this.#hideEnclave();\n }\n\n #cancelPendingProposals(): void {\n const cancelError = new Error(\"FaceSign operation cancelled\");\n\n if (this.#rejectSignMessage) {\n this.#rejectSignMessage(cancelError);\n this.#resolveSignMessage = null;\n this.#rejectSignMessage = null;\n }\n\n if (this.#rejectSessionProposal) {\n this.#rejectSessionProposal(cancelError);\n this.#resolveSessionProposal = null;\n this.#rejectSessionProposal = null;\n }\n }\n\n destroy(): void {\n this.#cancelPendingProposals();\n if (this.#messageListener) {\n window.removeEventListener(\"message\", this.#messageListener);\n this.#messageListener = null;\n }\n this.#destroyEnclave();\n }\n\n #createContainer(): HTMLDialogElement {\n const container = document.createElement(\"dialog\");\n Object.assign(container.style, {\n position: \"fixed\",\n inset: \"0\",\n width: \"100%\",\n height: \"100%\",\n maxWidth: \"100%\",\n maxHeight: \"100%\",\n margin: \"0\",\n padding: \"0\",\n border: \"none\",\n zIndex: \"99999\",\n background: \"#0a0a0a\",\n });\n document.body.appendChild(container);\n return container;\n }\n\n #ensureEnclave(timeoutMs = PROPOSAL_TIMEOUT_MS): Promise<void> {\n if (this.#iframe?.contentWindow) {\n return Promise.resolve();\n }\n\n return new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(\"FaceSign enclave failed to load\"));\n }, timeoutMs);\n\n if (!this.#container) {\n this.#container = this.#createContainer();\n }\n\n this.#iframe = document.createElement(\"iframe\");\n this.#iframe.src = this.#enclaveUrl;\n this.#iframe.title = \"FaceSign Enclave\";\n this.#iframe.allow = \"camera; fullscreen\";\n this.#iframe.style.cssText = \"width:100%;height:100%;border:none;\";\n\n this.#container.appendChild(this.#iframe);\n\n this.#resolveOpenEnclave = () => {\n console.log(\"resolveOpenEnclave\");\n clearTimeout(timer);\n resolve();\n };\n });\n }\n\n #showEnclave(): void {\n const el = this.#container;\n\n if (el && !el.open) {\n el.showModal();\n }\n }\n\n #hideEnclave(): void {\n const el = this.#container;\n if (el?.open) {\n el.close();\n }\n }\n\n #destroyEnclave(): void {\n if (this.#iframe) {\n this.#iframe.remove();\n this.#iframe = null;\n }\n if (this.#container) {\n this.#container.remove();\n this.#container = null;\n }\n }\n}\n"],"mappings":"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"}