passkey-kit 0.12.1 → 0.13.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.
- package/README.md +399 -227
- package/{types → dist}/base.d.ts +1 -0
- package/dist/base.d.ts.map +1 -0
- package/{src/base.ts → dist/base.js} +8 -10
- package/dist/base.js.map +1 -0
- package/dist/base64url.d.ts +18 -0
- package/dist/base64url.d.ts.map +1 -0
- package/dist/base64url.js +18 -0
- package/dist/base64url.js.map +1 -0
- package/dist/constants.d.ts +87 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +111 -0
- package/dist/constants.js.map +1 -0
- package/dist/contract-errors.d.ts +69 -0
- package/dist/contract-errors.d.ts.map +1 -0
- package/dist/contract-errors.js +129 -0
- package/dist/contract-errors.js.map +1 -0
- package/dist/errors.d.ts +163 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +244 -0
- package/dist/errors.js.map +1 -0
- package/dist/events.d.ts +94 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +92 -0
- package/dist/events.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer/codec.d.ts +18 -0
- package/dist/indexer/codec.d.ts.map +1 -0
- package/dist/indexer/codec.js +32 -0
- package/dist/indexer/codec.js.map +1 -0
- package/dist/indexer/index.d.ts +25 -0
- package/dist/indexer/index.d.ts.map +1 -0
- package/dist/indexer/index.js +34 -0
- package/dist/indexer/index.js.map +1 -0
- package/dist/indexer/mercury.d.ts +88 -0
- package/dist/indexer/mercury.d.ts.map +1 -0
- package/dist/indexer/mercury.js +237 -0
- package/dist/indexer/mercury.js.map +1 -0
- package/dist/indexer/stellar-indexer.d.ts +115 -0
- package/dist/indexer/stellar-indexer.d.ts.map +1 -0
- package/dist/indexer/stellar-indexer.js +279 -0
- package/dist/indexer/stellar-indexer.js.map +1 -0
- package/dist/indexer/types.d.ts +73 -0
- package/dist/indexer/types.d.ts.map +1 -0
- package/dist/indexer/types.js +9 -0
- package/dist/indexer/types.js.map +1 -0
- package/dist/kit/auth-payload.d.ts +89 -0
- package/dist/kit/auth-payload.d.ts.map +1 -0
- package/dist/kit/auth-payload.js +203 -0
- package/dist/kit/auth-payload.js.map +1 -0
- package/dist/kit/deploy-ops.d.ts +45 -0
- package/dist/kit/deploy-ops.d.ts.map +1 -0
- package/dist/kit/deploy-ops.js +69 -0
- package/dist/kit/deploy-ops.js.map +1 -0
- package/dist/kit/tx-ops.d.ts +92 -0
- package/dist/kit/tx-ops.d.ts.map +1 -0
- package/dist/kit/tx-ops.js +113 -0
- package/dist/kit/tx-ops.js.map +1 -0
- package/dist/kit/wallet-ops.d.ts +59 -0
- package/dist/kit/wallet-ops.d.ts.map +1 -0
- package/dist/kit/wallet-ops.js +122 -0
- package/dist/kit/wallet-ops.js.map +1 -0
- package/dist/kit/webauthn-ops.d.ts +55 -0
- package/dist/kit/webauthn-ops.d.ts.map +1 -0
- package/dist/kit/webauthn-ops.js +79 -0
- package/dist/kit/webauthn-ops.js.map +1 -0
- package/dist/kit.d.ts +128 -0
- package/dist/kit.d.ts.map +1 -0
- package/dist/kit.js +276 -0
- package/dist/kit.js.map +1 -0
- package/dist/managers/credential-manager.d.ts +39 -0
- package/dist/managers/credential-manager.d.ts.map +1 -0
- package/dist/managers/credential-manager.js +47 -0
- package/dist/managers/credential-manager.js.map +1 -0
- package/dist/managers/index.d.ts +7 -0
- package/dist/managers/index.d.ts.map +1 -0
- package/dist/managers/index.js +7 -0
- package/dist/managers/index.js.map +1 -0
- package/dist/managers/signer-manager.d.ts +51 -0
- package/dist/managers/signer-manager.d.ts.map +1 -0
- package/dist/managers/signer-manager.js +92 -0
- package/dist/managers/signer-manager.js.map +1 -0
- package/dist/managers/submission-manager.d.ts +52 -0
- package/dist/managers/submission-manager.d.ts.map +1 -0
- package/dist/managers/submission-manager.js +77 -0
- package/dist/managers/submission-manager.js.map +1 -0
- package/dist/relayer.d.ts +61 -0
- package/dist/relayer.d.ts.map +1 -0
- package/dist/relayer.js +119 -0
- package/dist/relayer.js.map +1 -0
- package/dist/rpc-data.d.ts +35 -0
- package/dist/rpc-data.d.ts.map +1 -0
- package/dist/rpc-data.js +49 -0
- package/dist/rpc-data.js.map +1 -0
- package/dist/sac.d.ts +31 -0
- package/dist/sac.d.ts.map +1 -0
- package/dist/sac.js +47 -0
- package/dist/sac.js.map +1 -0
- package/dist/server.d.ts +79 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +152 -0
- package/dist/server.js.map +1 -0
- package/dist/signers.d.ts +83 -0
- package/dist/signers.d.ts.map +1 -0
- package/dist/signers.js +124 -0
- package/dist/signers.js.map +1 -0
- package/dist/storage/index.d.ts +13 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +12 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/indexeddb.d.ts +26 -0
- package/dist/storage/indexeddb.d.ts.map +1 -0
- package/dist/storage/indexeddb.js +100 -0
- package/dist/storage/indexeddb.js.map +1 -0
- package/dist/storage/localStorage.d.ts +22 -0
- package/dist/storage/localStorage.d.ts.map +1 -0
- package/dist/storage/localStorage.js +86 -0
- package/dist/storage/localStorage.js.map +1 -0
- package/dist/storage/memory.d.ts +18 -0
- package/dist/storage/memory.d.ts.map +1 -0
- package/dist/storage/memory.js +41 -0
- package/dist/storage/memory.js.map +1 -0
- package/dist/types.d.ts +136 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +39 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +52 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +153 -0
- package/dist/utils.js.map +1 -0
- package/dist/validation.d.ts +40 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +73 -0
- package/dist/validation.js.map +1 -0
- package/dist/version.d.ts +7 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +9 -0
- package/dist/version.js.map +1 -0
- package/package.json +45 -18
- package/.claude/settings.local.json +0 -20
- package/.cursorrules +0 -170
- package/.gitattributes +0 -2
- package/.github/workflows/release.yml +0 -21
- package/.vscode/settings.json +0 -6
- package/PROPOSAL.md +0 -397
- package/cheatsheet.txt +0 -18
- package/clone-js-sdk.sh +0 -21
- package/packages/passkey-kit-sdk/README.md +0 -54
- package/packages/passkey-kit-sdk/package.json +0 -21
- package/packages/passkey-kit-sdk/src/index.ts +0 -171
- package/packages/passkey-kit-sdk/tsconfig.json +0 -98
- package/packages/passkey-kit-sdk/types/index.d.ts +0 -190
- package/packages/sac-sdk/README.md +0 -54
- package/packages/sac-sdk/package.json +0 -21
- package/packages/sac-sdk/src/index.ts +0 -586
- package/packages/sac-sdk/tsconfig.json +0 -98
- package/packages/sac-sdk/types/index.d.ts +0 -532
- package/pnpm-workspace.yaml +0 -2
- package/src/index.ts +0 -5
- package/src/kit.ts +0 -823
- package/src/sac.ts +0 -29
- package/src/server.ts +0 -179
- package/src/types.ts +0 -32
- package/tsconfig.json +0 -28
- package/types/index.d.ts +0 -5
- package/types/kit.d.ts +0 -95
- package/types/sac.d.ts +0 -13
- package/types/server.d.ts +0 -29
- package/types/types.d.ts +0 -22
package/dist/server.js
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `PasskeyServer` — the SERVER-ONLY counterpart to {@link PasskeyKit}.
|
|
3
|
+
*
|
|
4
|
+
* It holds the relayer API key and therefore must never run in a browser
|
|
5
|
+
* bundle: it is exported exclusively from the `passkey-kit/server` subpath so a
|
|
6
|
+
* bundler can't pull it into client code, and its config must come from
|
|
7
|
+
* server-side environment variables (never `VITE_`-prefixed).
|
|
8
|
+
*
|
|
9
|
+
* Responsibilities: fee-sponsored submission via {@link RelayerClient} and
|
|
10
|
+
* convenience signer-discovery helpers that delegate to a {@link MercuryIndexer}
|
|
11
|
+
* over Mercury's keyless hosted passkey-indexer. (`MercuryIndexer` itself is
|
|
12
|
+
* keyless and browser-safe — exported from the main `passkey-kit` entry; these
|
|
13
|
+
* server methods are a thin convenience over it.)
|
|
14
|
+
*
|
|
15
|
+
* @packageDocumentation
|
|
16
|
+
*/
|
|
17
|
+
import { TransactionBuilder, } from "@stellar/stellar-sdk";
|
|
18
|
+
import { Server } from "@stellar/stellar-sdk/rpc";
|
|
19
|
+
import { AssembledTransaction } from "@stellar/stellar-sdk/contract";
|
|
20
|
+
import { RelayerClient } from "./relayer.js";
|
|
21
|
+
import { ConfigurationError, IndexerError, RelayerError, PasskeyKitErrorCode, } from "./errors.js";
|
|
22
|
+
import { failedTransaction } from "./contract-errors.js";
|
|
23
|
+
import { MercuryIndexer } from "./indexer/index.js";
|
|
24
|
+
import { SignerKey } from "./types.js";
|
|
25
|
+
// Re-export the relayer surface so `passkey-kit/server` is the single
|
|
26
|
+
// server-only entrypoint (secrets never reach the browser bundle).
|
|
27
|
+
export { RelayerClient, } from "./relayer.js";
|
|
28
|
+
/** Normalize any submittable input to a built {@link Transaction}. */
|
|
29
|
+
function toBuiltTransaction(input, networkPassphrase) {
|
|
30
|
+
if (typeof input === "string") {
|
|
31
|
+
return TransactionBuilder.fromXDR(input, networkPassphrase);
|
|
32
|
+
}
|
|
33
|
+
if (input instanceof AssembledTransaction) {
|
|
34
|
+
if (!input.built) {
|
|
35
|
+
throw new RelayerError("AssembledTransaction has not been built/simulated yet", PasskeyKitErrorCode.RELAYER_REQUEST_FAILED);
|
|
36
|
+
}
|
|
37
|
+
return input.built;
|
|
38
|
+
}
|
|
39
|
+
return input;
|
|
40
|
+
}
|
|
41
|
+
/** Whether any invokeHostFunction op carries source-account auth. */
|
|
42
|
+
function hasSourceAccountAuth(transaction) {
|
|
43
|
+
for (const op of transaction.operations) {
|
|
44
|
+
if (op.type !== "invokeHostFunction")
|
|
45
|
+
continue;
|
|
46
|
+
for (const entry of op.auth ?? []) {
|
|
47
|
+
if (entry.credentials().switch().name === "sorobanCredentialsSourceAccount") {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
export class PasskeyServer {
|
|
55
|
+
networkPassphrase;
|
|
56
|
+
rpc;
|
|
57
|
+
relayer;
|
|
58
|
+
mercury;
|
|
59
|
+
constructor(config) {
|
|
60
|
+
if (!config.networkPassphrase) {
|
|
61
|
+
throw new ConfigurationError("networkPassphrase is required", PasskeyKitErrorCode.MISSING_CONFIG);
|
|
62
|
+
}
|
|
63
|
+
this.networkPassphrase = config.networkPassphrase;
|
|
64
|
+
if (config.rpcUrl) {
|
|
65
|
+
this.rpc = new Server(config.rpcUrl);
|
|
66
|
+
}
|
|
67
|
+
if (config.relayer) {
|
|
68
|
+
this.relayer = new RelayerClient(config.relayer);
|
|
69
|
+
}
|
|
70
|
+
if (config.mercury) {
|
|
71
|
+
const mercury = MercuryIndexer.forNetwork({ url: config.mercury.url, rpc: this.rpc }, this.networkPassphrase);
|
|
72
|
+
if (!mercury) {
|
|
73
|
+
throw new ConfigurationError("Mercury has no hosted passkey-indexer for this network; pass mercury.url to point at a self-hosted instance", PasskeyKitErrorCode.INVALID_CONFIG);
|
|
74
|
+
}
|
|
75
|
+
this.mercury = mercury;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// -- Submission --------------------------------------------------------------
|
|
79
|
+
/**
|
|
80
|
+
* Submit a transaction via the relayer for fee sponsorship.
|
|
81
|
+
*
|
|
82
|
+
* invokeHostFunction transactions without source-account auth use the preferred
|
|
83
|
+
* `{ func, auth }` Soroban path; everything else (deploys, source-account auth)
|
|
84
|
+
* is fee-bumped via the `{ xdr }` envelope path. Never throws — returns a typed
|
|
85
|
+
* {@link TransactionResult}.
|
|
86
|
+
*/
|
|
87
|
+
async send(input, options) {
|
|
88
|
+
if (!this.relayer) {
|
|
89
|
+
return failedTransaction(new RelayerError("Relayer is not configured on this PasskeyServer", PasskeyKitErrorCode.RELAYER_NOT_CONFIGURED));
|
|
90
|
+
}
|
|
91
|
+
let built;
|
|
92
|
+
try {
|
|
93
|
+
built = toBuiltTransaction(input, this.networkPassphrase);
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
return failedTransaction(err instanceof RelayerError
|
|
97
|
+
? err
|
|
98
|
+
: new RelayerError(err instanceof Error ? err.message : String(err), PasskeyKitErrorCode.RELAYER_REQUEST_FAILED));
|
|
99
|
+
}
|
|
100
|
+
const op = built.operations[0];
|
|
101
|
+
if (op?.type === "invokeHostFunction" && !hasSourceAccountAuth(built)) {
|
|
102
|
+
const invokeOp = op;
|
|
103
|
+
const func = invokeOp.func.toXDR("base64");
|
|
104
|
+
const auth = (invokeOp.auth ?? []).map((entry) => entry.toXDR("base64"));
|
|
105
|
+
return this.relayer.send(func, auth, options);
|
|
106
|
+
}
|
|
107
|
+
return this.relayer.sendTransaction(built.toXDR(), options);
|
|
108
|
+
}
|
|
109
|
+
/** Poll a `skipWait` submission by its relayer transaction id. */
|
|
110
|
+
getTransaction(transactionId) {
|
|
111
|
+
if (!this.relayer) {
|
|
112
|
+
return Promise.resolve(failedTransaction(new RelayerError("Relayer is not configured on this PasskeyServer", PasskeyKitErrorCode.RELAYER_NOT_CONFIGURED)));
|
|
113
|
+
}
|
|
114
|
+
return this.relayer.getTransaction(transactionId);
|
|
115
|
+
}
|
|
116
|
+
// -- Indexer (convenience delegation to the keyless Mercury passkey-indexer) --
|
|
117
|
+
requireMercury() {
|
|
118
|
+
if (!this.mercury) {
|
|
119
|
+
throw new IndexerError("Mercury indexer is not configured on this PasskeyServer", PasskeyKitErrorCode.INDEXER_NOT_CONFIGURED);
|
|
120
|
+
}
|
|
121
|
+
return this.mercury;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Enumerate a wallet's signers via Mercury. Temporary signers whose ledger
|
|
125
|
+
* entry has been evicted are flagged `status: "evicted"` when this server was
|
|
126
|
+
* given an `rpcUrl` (the indexer can't observe TTL eviction directly).
|
|
127
|
+
*/
|
|
128
|
+
getSigners(contractId) {
|
|
129
|
+
return this.requireMercury().getSigners(contractId);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Reverse lookup: find the wallet(s) a signer belongs to via Mercury.
|
|
133
|
+
*
|
|
134
|
+
* @returns the confirmed address at `index`, or `undefined` if there are none.
|
|
135
|
+
*/
|
|
136
|
+
async getContractId(options, index = 0) {
|
|
137
|
+
const provided = [options.keyId, options.publicKey, options.policy].filter(Boolean);
|
|
138
|
+
if (provided.length !== 1) {
|
|
139
|
+
throw new IndexerError("Provide exactly one of keyId, publicKey, or policy", PasskeyKitErrorCode.INDEXER_REQUEST_FAILED);
|
|
140
|
+
}
|
|
141
|
+
let key;
|
|
142
|
+
if (options.keyId)
|
|
143
|
+
key = SignerKey.Secp256r1(options.keyId);
|
|
144
|
+
else if (options.publicKey)
|
|
145
|
+
key = SignerKey.Ed25519(options.publicKey);
|
|
146
|
+
else
|
|
147
|
+
key = SignerKey.Policy(options.policy);
|
|
148
|
+
const wallets = await this.requireMercury().findWallets(key);
|
|
149
|
+
return wallets[index];
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed signer abstraction for the flat `Signatures` map.
|
|
3
|
+
*
|
|
4
|
+
* A {@link Signer} knows how to authenticate a signature payload (the 32-byte
|
|
5
|
+
* hash from `buildSignaturePayload`) and produce the on-chain
|
|
6
|
+
* `(SignerKey, Signature)` pair the wallet's `__check_auth` expects. This
|
|
7
|
+
* replaces the old `sign({ keyId | keypair | policy })` option trio, where the
|
|
8
|
+
* caller had to pass exactly one of three mutually-exclusive fields, with three
|
|
9
|
+
* explicit signer classes:
|
|
10
|
+
*
|
|
11
|
+
* - {@link PasskeySigner} — a WebAuthn secp256r1 passkey (default).
|
|
12
|
+
* - {@link Ed25519Signer} — a local Stellar keypair.
|
|
13
|
+
* - {@link PolicySigner} — a policy contract co-signer (no signature bytes).
|
|
14
|
+
*
|
|
15
|
+
* @packageDocumentation
|
|
16
|
+
*/
|
|
17
|
+
import { Keypair } from "@stellar/stellar-sdk";
|
|
18
|
+
import type { AuthenticationResponseJSON, PublicKeyCredentialRequestOptionsJSON } from "@simplewebauthn/browser";
|
|
19
|
+
import type { Signature as SDKSignature, SignerKey as SDKSignerKey } from "passkey-kit-sdk";
|
|
20
|
+
/** The WebAuthn `startAuthentication` surface a {@link PasskeySigner} needs. */
|
|
21
|
+
export interface WebAuthnAuthenticator {
|
|
22
|
+
startAuthentication(args: {
|
|
23
|
+
optionsJSON: PublicKeyCredentialRequestOptionsJSON;
|
|
24
|
+
}): Promise<AuthenticationResponseJSON>;
|
|
25
|
+
}
|
|
26
|
+
/** Ambient context passed to every {@link Signer.sign} call by the kit. */
|
|
27
|
+
export interface SignerContext {
|
|
28
|
+
/** WebAuthn Relying Party id (domain); defaults to the current origin. */
|
|
29
|
+
rpId?: string;
|
|
30
|
+
/** The WebAuthn implementation (overridable for tests). */
|
|
31
|
+
webAuthn: WebAuthnAuthenticator;
|
|
32
|
+
/** The connected wallet's default passkey keyId (base64url), when known. */
|
|
33
|
+
defaultKeyId?: string;
|
|
34
|
+
}
|
|
35
|
+
/** The on-chain `(SignerKey, Signature)` pair a signer produces. */
|
|
36
|
+
export interface PreparedSignature {
|
|
37
|
+
key: SDKSignerKey;
|
|
38
|
+
/** `undefined` for policy signers (the map stores `scvVoid` for the value). */
|
|
39
|
+
value: SDKSignature | undefined;
|
|
40
|
+
}
|
|
41
|
+
/** A signer for the wallet's flat `Signatures` map. */
|
|
42
|
+
export interface Signer {
|
|
43
|
+
/** Authenticate a signature payload into an on-chain signature pair. */
|
|
44
|
+
sign(payload: Buffer, context: SignerContext): Promise<PreparedSignature> | PreparedSignature;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* An Ed25519 signer backed by a local Stellar keypair.
|
|
48
|
+
*/
|
|
49
|
+
export declare class Ed25519Signer implements Signer {
|
|
50
|
+
private readonly keypair;
|
|
51
|
+
constructor(keypair: Keypair);
|
|
52
|
+
/**
|
|
53
|
+
* Build an {@link Ed25519Signer} from a Stellar secret key (`S…`).
|
|
54
|
+
*
|
|
55
|
+
* @throws {ValidationError} If the secret key is invalid.
|
|
56
|
+
*/
|
|
57
|
+
static fromSecret(secretKey: string): Ed25519Signer;
|
|
58
|
+
/** The signer's `G…` public key. */
|
|
59
|
+
get address(): string;
|
|
60
|
+
sign(payload: Buffer): PreparedSignature;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* A policy signer: a policy contract co-authorizes the entry. The map value is
|
|
64
|
+
* `scvVoid`; the wallet calls the policy's `policy__` during `__check_auth`.
|
|
65
|
+
*/
|
|
66
|
+
export declare class PolicySigner implements Signer {
|
|
67
|
+
private readonly policy;
|
|
68
|
+
constructor(policy: string);
|
|
69
|
+
sign(): PreparedSignature;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* A WebAuthn secp256r1 passkey signer.
|
|
73
|
+
*
|
|
74
|
+
* Pass a specific `keyId` to require that credential, `"any"` to let the
|
|
75
|
+
* authenticator pick a discoverable credential, or omit it to use the kit's
|
|
76
|
+
* connected passkey ({@link SignerContext.defaultKeyId}).
|
|
77
|
+
*/
|
|
78
|
+
export declare class PasskeySigner implements Signer {
|
|
79
|
+
private readonly keyId;
|
|
80
|
+
constructor(keyId?: "any" | string | Uint8Array);
|
|
81
|
+
sign(payload: Buffer, context: SignerContext): Promise<PreparedSignature>;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=signers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signers.d.ts","sourceRoot":"","sources":["../src/signers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,KAAK,EACV,0BAA0B,EAC1B,qCAAqC,EACtC,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EACV,SAAS,IAAI,YAAY,EACzB,SAAS,IAAI,YAAY,EAC1B,MAAM,iBAAiB,CAAC;AAMzB,gFAAgF;AAChF,MAAM,WAAW,qBAAqB;IACpC,mBAAmB,CAAC,IAAI,EAAE;QACxB,WAAW,EAAE,qCAAqC,CAAC;KACpD,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC;CACzC;AAED,2EAA2E;AAC3E,MAAM,WAAW,aAAa;IAC5B,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,QAAQ,EAAE,qBAAqB,CAAC;IAChC,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,oEAAoE;AACpE,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,YAAY,CAAC;IAClB,+EAA+E;IAC/E,KAAK,EAAE,YAAY,GAAG,SAAS,CAAC;CACjC;AAED,uDAAuD;AACvD,MAAM,WAAW,MAAM;IACrB,wEAAwE;IACxE,IAAI,CACF,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAAC;CACnD;AAED;;GAEG;AACH,qBAAa,aAAc,YAAW,MAAM;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;gBAEtB,OAAO,EAAE,OAAO;IAI5B;;;;OAIG;IACH,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa;IAUnD,oCAAoC;IACpC,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB;CAOzC;AAED;;;GAGG;AACH,qBAAa,YAAa,YAAW,MAAM;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,EAAE,MAAM;IAI1B,IAAI,IAAI,iBAAiB;CAM1B;AAED;;;;;;GAMG;AACH,qBAAa,aAAc,YAAW,MAAM;IAC1C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;gBAEvC,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,UAAU;IAKzC,IAAI,CACR,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,iBAAiB,CAAC;CAuD9B"}
|
package/dist/signers.js
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed signer abstraction for the flat `Signatures` map.
|
|
3
|
+
*
|
|
4
|
+
* A {@link Signer} knows how to authenticate a signature payload (the 32-byte
|
|
5
|
+
* hash from `buildSignaturePayload`) and produce the on-chain
|
|
6
|
+
* `(SignerKey, Signature)` pair the wallet's `__check_auth` expects. This
|
|
7
|
+
* replaces the old `sign({ keyId | keypair | policy })` option trio, where the
|
|
8
|
+
* caller had to pass exactly one of three mutually-exclusive fields, with three
|
|
9
|
+
* explicit signer classes:
|
|
10
|
+
*
|
|
11
|
+
* - {@link PasskeySigner} — a WebAuthn secp256r1 passkey (default).
|
|
12
|
+
* - {@link Ed25519Signer} — a local Stellar keypair.
|
|
13
|
+
* - {@link PolicySigner} — a policy contract co-signer (no signature bytes).
|
|
14
|
+
*
|
|
15
|
+
* @packageDocumentation
|
|
16
|
+
*/
|
|
17
|
+
import { Keypair } from "@stellar/stellar-sdk";
|
|
18
|
+
import base64url from "./base64url.js";
|
|
19
|
+
import { compactSignature } from "./utils.js";
|
|
20
|
+
import { ValidationError, PasskeyKitErrorCode } from "./errors.js";
|
|
21
|
+
import { WEBAUTHN_TIMEOUT_MS } from "./constants.js";
|
|
22
|
+
/**
|
|
23
|
+
* An Ed25519 signer backed by a local Stellar keypair.
|
|
24
|
+
*/
|
|
25
|
+
export class Ed25519Signer {
|
|
26
|
+
keypair;
|
|
27
|
+
constructor(keypair) {
|
|
28
|
+
this.keypair = keypair;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Build an {@link Ed25519Signer} from a Stellar secret key (`S…`).
|
|
32
|
+
*
|
|
33
|
+
* @throws {ValidationError} If the secret key is invalid.
|
|
34
|
+
*/
|
|
35
|
+
static fromSecret(secretKey) {
|
|
36
|
+
try {
|
|
37
|
+
return new Ed25519Signer(Keypair.fromSecret(secretKey));
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
throw new ValidationError("Invalid Ed25519 secret key (must be a valid Stellar secret key, S…)");
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/** The signer's `G…` public key. */
|
|
44
|
+
get address() {
|
|
45
|
+
return this.keypair.publicKey();
|
|
46
|
+
}
|
|
47
|
+
sign(payload) {
|
|
48
|
+
const signature = this.keypair.sign(payload);
|
|
49
|
+
return {
|
|
50
|
+
key: { tag: "Ed25519", values: [Buffer.from(this.keypair.rawPublicKey())] },
|
|
51
|
+
value: { tag: "Ed25519", values: [signature] },
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* A policy signer: a policy contract co-authorizes the entry. The map value is
|
|
57
|
+
* `scvVoid`; the wallet calls the policy's `policy__` during `__check_auth`.
|
|
58
|
+
*/
|
|
59
|
+
export class PolicySigner {
|
|
60
|
+
policy;
|
|
61
|
+
constructor(policy) {
|
|
62
|
+
this.policy = policy;
|
|
63
|
+
}
|
|
64
|
+
sign() {
|
|
65
|
+
return {
|
|
66
|
+
key: { tag: "Policy", values: [this.policy] },
|
|
67
|
+
value: { tag: "Policy", values: undefined },
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* A WebAuthn secp256r1 passkey signer.
|
|
73
|
+
*
|
|
74
|
+
* Pass a specific `keyId` to require that credential, `"any"` to let the
|
|
75
|
+
* authenticator pick a discoverable credential, or omit it to use the kit's
|
|
76
|
+
* connected passkey ({@link SignerContext.defaultKeyId}).
|
|
77
|
+
*/
|
|
78
|
+
export class PasskeySigner {
|
|
79
|
+
keyId;
|
|
80
|
+
constructor(keyId) {
|
|
81
|
+
this.keyId =
|
|
82
|
+
keyId instanceof Uint8Array ? base64url(Buffer.from(keyId)) : keyId;
|
|
83
|
+
}
|
|
84
|
+
async sign(payload, context) {
|
|
85
|
+
const requestedKeyId = this.keyId === "any" ? undefined : this.keyId ?? context.defaultKeyId;
|
|
86
|
+
// No specific credential → let the authenticator choose a discoverable one.
|
|
87
|
+
const discoverable = this.keyId === "any" || requestedKeyId === undefined;
|
|
88
|
+
const optionsJSON = {
|
|
89
|
+
challenge: base64url(payload),
|
|
90
|
+
rpId: context.rpId,
|
|
91
|
+
userVerification: "preferred",
|
|
92
|
+
timeout: WEBAUTHN_TIMEOUT_MS,
|
|
93
|
+
...(discoverable
|
|
94
|
+
? {}
|
|
95
|
+
: {
|
|
96
|
+
allowCredentials: [{ id: requestedKeyId, type: "public-key" }],
|
|
97
|
+
}),
|
|
98
|
+
};
|
|
99
|
+
let response;
|
|
100
|
+
try {
|
|
101
|
+
response = await context.webAuthn.startAuthentication({ optionsJSON });
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
throw new ValidationError("WebAuthn authentication failed", PasskeyKitErrorCode.INVALID_INPUT, { cause: err instanceof Error ? err.message : String(err) });
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
key: {
|
|
108
|
+
tag: "Secp256r1",
|
|
109
|
+
values: [base64url.toBuffer(response.id)],
|
|
110
|
+
},
|
|
111
|
+
value: {
|
|
112
|
+
tag: "Secp256r1",
|
|
113
|
+
values: [
|
|
114
|
+
{
|
|
115
|
+
authenticator_data: base64url.toBuffer(response.response.authenticatorData),
|
|
116
|
+
client_data_json: base64url.toBuffer(response.response.clientDataJSON),
|
|
117
|
+
signature: Buffer.from(compactSignature(base64url.toBuffer(response.response.signature))),
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=signers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signers.js","sourceRoot":"","sources":["../src/signers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAS/C,OAAO,SAAS,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAmCrD;;GAEG;AACH,MAAM,OAAO,aAAa;IACP,OAAO,CAAU;IAElC,YAAY,OAAgB;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,UAAU,CAAC,SAAiB;QACjC,IAAI,CAAC;YACH,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;QAC1D,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,eAAe,CACvB,qEAAqE,CACtE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;IAClC,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7C,OAAO;YACL,GAAG,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE;YAC3E,KAAK,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE;SAC/C,CAAC;IACJ,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,YAAY;IACN,MAAM,CAAS;IAEhC,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,IAAI;QACF,OAAO;YACL,GAAG,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;YAC7C,KAAK,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE;SAC5C,CAAC;IACJ,CAAC;CACF;AAED;;;;;;GAMG;AACH,MAAM,OAAO,aAAa;IACP,KAAK,CAA6B;IAEnD,YAAY,KAAmC;QAC7C,IAAI,CAAC,KAAK;YACR,KAAK,YAAY,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,IAAI,CACR,OAAe,EACf,OAAsB;QAEtB,MAAM,cAAc,GAClB,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,YAAY,CAAC;QAExE,4EAA4E;QAC5E,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,cAAc,KAAK,SAAS,CAAC;QAE1E,MAAM,WAAW,GAA0C;YACzD,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC;YAC7B,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,gBAAgB,EAAE,WAAW;YAC7B,OAAO,EAAE,mBAAmB;YAC5B,GAAG,CAAC,YAAY;gBACd,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC;oBACE,gBAAgB,EAAE,CAAC,EAAE,EAAE,EAAE,cAAe,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;iBAChE,CAAC;SACP,CAAC;QAEF,IAAI,QAAoC,CAAC;QACzC,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;QACzE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,eAAe,CACvB,gCAAgC,EAChC,mBAAmB,CAAC,aAAa,EACjC,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC5D,CAAC;QACJ,CAAC;QAED,OAAO;YACL,GAAG,EAAE;gBACH,GAAG,EAAE,WAAW;gBAChB,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;aAC1C;YACD,KAAK,EAAE;gBACL,GAAG,EAAE,WAAW;gBAChB,MAAM,EAAE;oBACN;wBACE,kBAAkB,EAAE,SAAS,CAAC,QAAQ,CACpC,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CACpC;wBACD,gBAAgB,EAAE,SAAS,CAAC,QAAQ,CAClC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CACjC;wBACD,SAAS,EAAE,MAAM,CAAC,IAAI,CACpB,gBAAgB,CACd,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAChD,CACF;qBACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Storage adapters for passkey persistence.
|
|
3
|
+
*
|
|
4
|
+
* Import from the `passkey-kit/storage` subpath:
|
|
5
|
+
* ```typescript
|
|
6
|
+
* import { IndexedDBStorage, MemoryStorage } from "passkey-kit/storage";
|
|
7
|
+
* ```
|
|
8
|
+
*/
|
|
9
|
+
export { MemoryStorage } from "./memory.js";
|
|
10
|
+
export { LocalStorageAdapter } from "./localStorage.js";
|
|
11
|
+
export { IndexedDBStorage } from "./indexeddb.js";
|
|
12
|
+
export type { StorageAdapter, StoredPasskey } from "../types.js";
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Storage adapters for passkey persistence.
|
|
3
|
+
*
|
|
4
|
+
* Import from the `passkey-kit/storage` subpath:
|
|
5
|
+
* ```typescript
|
|
6
|
+
* import { IndexedDBStorage, MemoryStorage } from "passkey-kit/storage";
|
|
7
|
+
* ```
|
|
8
|
+
*/
|
|
9
|
+
export { MemoryStorage } from "./memory.js";
|
|
10
|
+
export { LocalStorageAdapter } from "./localStorage.js";
|
|
11
|
+
export { IndexedDBStorage } from "./indexeddb.js";
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IndexedDB passkey storage adapter.
|
|
3
|
+
*
|
|
4
|
+
* Recommended for web apps: larger limits than localStorage, an async API that
|
|
5
|
+
* doesn't block the main thread, and native `Uint8Array` support.
|
|
6
|
+
*/
|
|
7
|
+
import type { StorageAdapter, StoredPasskey } from "../types.js";
|
|
8
|
+
export declare class IndexedDBStorage implements StorageAdapter {
|
|
9
|
+
private dbName;
|
|
10
|
+
private dbPromise;
|
|
11
|
+
constructor(dbName?: string);
|
|
12
|
+
private getDB;
|
|
13
|
+
private withStore;
|
|
14
|
+
save(passkey: StoredPasskey): Promise<void>;
|
|
15
|
+
get(keyId: string): Promise<StoredPasskey | null>;
|
|
16
|
+
getByContract(contractId: string): Promise<StoredPasskey[]>;
|
|
17
|
+
getAll(): Promise<StoredPasskey[]>;
|
|
18
|
+
delete(keyId: string): Promise<void>;
|
|
19
|
+
update(keyId: string, updates: Partial<Omit<StoredPasskey, "keyId" | "publicKey">>): Promise<void>;
|
|
20
|
+
clear(): Promise<void>;
|
|
21
|
+
/** Close the database connection. */
|
|
22
|
+
close(): Promise<void>;
|
|
23
|
+
/** Delete the entire database. */
|
|
24
|
+
static deleteDatabase(dbName?: string): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=indexeddb.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexeddb.d.ts","sourceRoot":"","sources":["../../src/storage/indexeddb.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAQjE,qBAAa,gBAAiB,YAAW,cAAc;IACrD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAqC;gBAE1C,MAAM,GAAE,MAAgB;YAItB,KAAK;YAgCL,SAAS;IAiBjB,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAQjD,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAgB3D,MAAM,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAMlC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpC,MAAM,CACV,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,GAAG,WAAW,CAAC,CAAC,GAC3D,OAAO,CAAC,IAAI,CAAC;IAOV,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,qCAAqC;IAC/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B,kCAAkC;WACrB,cAAc,CAAC,MAAM,GAAE,MAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;CAQrE"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IndexedDB passkey storage adapter.
|
|
3
|
+
*
|
|
4
|
+
* Recommended for web apps: larger limits than localStorage, an async API that
|
|
5
|
+
* doesn't block the main thread, and native `Uint8Array` support.
|
|
6
|
+
*/
|
|
7
|
+
import { DB_NAME, DB_VERSION, IDB_STORE_CREDENTIALS, IDB_INDEX_CONTRACT_ID, } from "../constants.js";
|
|
8
|
+
export class IndexedDBStorage {
|
|
9
|
+
dbName;
|
|
10
|
+
dbPromise = null;
|
|
11
|
+
constructor(dbName = DB_NAME) {
|
|
12
|
+
this.dbName = dbName;
|
|
13
|
+
}
|
|
14
|
+
async getDB() {
|
|
15
|
+
if (this.dbPromise)
|
|
16
|
+
return this.dbPromise;
|
|
17
|
+
this.dbPromise = new Promise((resolve, reject) => {
|
|
18
|
+
if (typeof indexedDB === "undefined") {
|
|
19
|
+
reject(new Error("IndexedDB is not available in this environment"));
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const request = indexedDB.open(this.dbName, DB_VERSION);
|
|
23
|
+
request.onerror = () => reject(new Error(`Failed to open IndexedDB: ${request.error?.message}`));
|
|
24
|
+
request.onsuccess = () => resolve(request.result);
|
|
25
|
+
request.onupgradeneeded = (event) => {
|
|
26
|
+
const db = event.target.result;
|
|
27
|
+
if (!db.objectStoreNames.contains(IDB_STORE_CREDENTIALS)) {
|
|
28
|
+
const store = db.createObjectStore(IDB_STORE_CREDENTIALS, {
|
|
29
|
+
keyPath: "keyId",
|
|
30
|
+
});
|
|
31
|
+
store.createIndex(IDB_INDEX_CONTRACT_ID, IDB_INDEX_CONTRACT_ID, {
|
|
32
|
+
unique: false,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
return this.dbPromise;
|
|
38
|
+
}
|
|
39
|
+
async withStore(mode, callback) {
|
|
40
|
+
const db = await this.getDB();
|
|
41
|
+
return new Promise((resolve, reject) => {
|
|
42
|
+
const transaction = db.transaction(IDB_STORE_CREDENTIALS, mode);
|
|
43
|
+
const store = transaction.objectStore(IDB_STORE_CREDENTIALS);
|
|
44
|
+
const request = callback(store);
|
|
45
|
+
request.onsuccess = () => resolve(request.result);
|
|
46
|
+
request.onerror = () => reject(new Error(`IndexedDB operation failed: ${request.error?.message}`));
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async save(passkey) {
|
|
50
|
+
await this.withStore("readwrite", (store) => store.put(passkey));
|
|
51
|
+
}
|
|
52
|
+
async get(keyId) {
|
|
53
|
+
const result = await this.withStore("readonly", (store) => store.get(keyId));
|
|
54
|
+
return result ?? null;
|
|
55
|
+
}
|
|
56
|
+
async getByContract(contractId) {
|
|
57
|
+
const db = await this.getDB();
|
|
58
|
+
return new Promise((resolve, reject) => {
|
|
59
|
+
const transaction = db.transaction(IDB_STORE_CREDENTIALS, "readonly");
|
|
60
|
+
const index = transaction
|
|
61
|
+
.objectStore(IDB_STORE_CREDENTIALS)
|
|
62
|
+
.index(IDB_INDEX_CONTRACT_ID);
|
|
63
|
+
const request = index.getAll(contractId);
|
|
64
|
+
request.onsuccess = () => resolve(request.result);
|
|
65
|
+
request.onerror = () => reject(new Error(`Failed to query by contract: ${request.error?.message}`));
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
async getAll() {
|
|
69
|
+
return this.withStore("readonly", (store) => store.getAll());
|
|
70
|
+
}
|
|
71
|
+
async delete(keyId) {
|
|
72
|
+
await this.withStore("readwrite", (store) => store.delete(keyId));
|
|
73
|
+
}
|
|
74
|
+
async update(keyId, updates) {
|
|
75
|
+
const existing = await this.get(keyId);
|
|
76
|
+
if (existing) {
|
|
77
|
+
await this.save({ ...existing, ...updates });
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async clear() {
|
|
81
|
+
await this.withStore("readwrite", (store) => store.clear());
|
|
82
|
+
}
|
|
83
|
+
/** Close the database connection. */
|
|
84
|
+
async close() {
|
|
85
|
+
if (this.dbPromise) {
|
|
86
|
+
const db = await this.dbPromise;
|
|
87
|
+
db.close();
|
|
88
|
+
this.dbPromise = null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/** Delete the entire database. */
|
|
92
|
+
static async deleteDatabase(dbName = DB_NAME) {
|
|
93
|
+
return new Promise((resolve, reject) => {
|
|
94
|
+
const request = indexedDB.deleteDatabase(dbName);
|
|
95
|
+
request.onsuccess = () => resolve();
|
|
96
|
+
request.onerror = () => reject(new Error(`Failed to delete database: ${request.error?.message}`));
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=indexeddb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexeddb.js","sourceRoot":"","sources":["../../src/storage/indexeddb.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `localStorage` passkey storage adapter.
|
|
3
|
+
*
|
|
4
|
+
* Persists passkey records across page reloads in the browser. `localStorage`
|
|
5
|
+
* has a ~5MB limit and stores data unencrypted; for larger or more structured
|
|
6
|
+
* needs prefer {@link import("./indexeddb.js").IndexedDBStorage}.
|
|
7
|
+
*/
|
|
8
|
+
import type { StorageAdapter, StoredPasskey } from "../types.js";
|
|
9
|
+
export declare class LocalStorageAdapter implements StorageAdapter {
|
|
10
|
+
private storageKey;
|
|
11
|
+
constructor(storageKey?: string);
|
|
12
|
+
private read;
|
|
13
|
+
private write;
|
|
14
|
+
save(passkey: StoredPasskey): Promise<void>;
|
|
15
|
+
get(keyId: string): Promise<StoredPasskey | null>;
|
|
16
|
+
getByContract(contractId: string): Promise<StoredPasskey[]>;
|
|
17
|
+
getAll(): Promise<StoredPasskey[]>;
|
|
18
|
+
delete(keyId: string): Promise<void>;
|
|
19
|
+
update(keyId: string, updates: Partial<Omit<StoredPasskey, "keyId" | "publicKey">>): Promise<void>;
|
|
20
|
+
clear(): Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=localStorage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"localStorage.d.ts","sourceRoot":"","sources":["../../src/storage/localStorage.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAmBjE,qBAAa,mBAAoB,YAAW,cAAc;IACxD,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,GAAE,MAAqC;IAI7D,OAAO,CAAC,IAAI;IA0BZ,OAAO,CAAC,KAAK;IAQP,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3C,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAIjD,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAU3D,MAAM,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAIlC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMpC,MAAM,CACV,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,GAAG,WAAW,CAAC,CAAC,GAC3D,OAAO,CAAC,IAAI,CAAC;IASV,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
|